昨天测试说服务器在多人同时进入房间时会导致崩溃现象,去查看服务器打印出来的日志,冒出一长串错误,看错误应该是游戏逻辑陷入了死循环:
[:00000000] A message from [ :0100007c ] to [ :01000082 ] maybe in an endless loop (version = 2499)
[:00000000] A message from [ :0100007c ] to [ :01000082 ] maybe in an endless loop (version = 2499)
[:00000000] A message from [ :0100007c ] to [ :01000082 ] maybe in an endless loop (version = 2499)
看错误提示一开始以为错误是 [ :0100007c ] 对应的服务器发信息到 [ :01000082 ] 对应的服务器时,[ :01000082 ] 又返回消息到 [ :0100007c ] ,然后 [ :0100007c ] 再发信息到 [ :01000082 ] 这样的死循环。,
在控制台中用 list 命令打印出所有的服务器,找到了[ :0100007c ]对应的服务器。从日志输出找到了出错的函数,检查几遍代码逻辑,没发现会陷入死循环的地方。又查看了下 [ :01000082 ] 对应的服务器代码逻辑,还是没有找到会陷入死循环的地方。
百度了下,发现云风大大早就提供了查找死循环的方法。在出现死循环的时候,在控制台中输入如下的命令,便可打印出陷入死循环的地方。
signal address
这里我们陷入死循环的服务器是 [ :01000082 ] ,输入 signal 01000082 后,便在log中打印出了死循环出现的地方。从日志中发现是自己的代码逻辑判断出问题了,执行到了不该执行的地方,卡在了while里面,而不是之前以为的两个服务器之间互相一直调用的死循环。
网友评论