« 在不安全的网络环境下安全上网 | 返回首页 | 平等 »

出在 recv 上的一个 bug

今天 卡牌对决 新版本发布,几乎都已经更新包放出来了,突然发现了 bug 。那个紧张哦,好在临危不乱 :) 用了半小时仔细阅读代码,找出了 bug 。

由于这次需要部署多个网络接入点,解决网通、电信、教育网互联的问题。我申请了各个网络的多台机器。新申请的机器是跑的 debian/linux ,而不是我们开发时用的 freebsd 。一个以前在 freebsd 上跑的正常的程序,放在 linux 出了问题,一开始让我很不解。

仔细查看后,发现 bug 出在一个 recv 调用上。用 gdb attach 到锁死的进程中,确认果然是一处 recv 调用没有返回。

原来,一旦用阻塞方式去 recv 0 字节长度。比如:

recv(fd,buf,0,MSG_WAITALL);

在 linux 上,系统调用就会一直阻塞而不返回了。

经同事验证,freebsd 上这样做,调用会返回 0 ,并设置一个奇怪的 errno 。但这种行为不会导致程序的行为错误。

当然,这是一个程序实现的 bug ,recv 传长度 0 一种结果未定义的行为。只是我觉得 freebsd 的行为要人性一点,呵呵。


btw, 这两天发现,debian 下默认的 syslogd 不太好用。居然不能像 freebsd 下的那样,配置成按 ident 字符串过滤。怪不得在 linux 下开发的同事没有使用 syslog 输出 log 的习惯。

或者,是我不会用?

Comments

非常好。
你的名字和我的名字还有点相同哈` 不看不知道,一看吓一跳
是一个error吧,呵呵 博客不错,有空会常来逛逛
其实像这样的错误,建议查看一下linux和freebsd的man page,不同系统的man page的描述是不完全一样的。
新年快乐 :)
我觉得卡牌对决还是蛮好玩的,不过在线人好少啊……
可以试试 syslog-ng。
AI 有些协议上的 bug ,导致跟 AI 玩的时候 client 有时会出错。 现在同事正在抓紧修改,明天应该放个 patch 就好了。
晕.下了个不能玩.点围地就出错 coroutine@script\server_cardgame.lua:82: 1000 调用栈: stack traceback: [C]: in function 'assert' script\server_cardgame.lua:82: in function 'deliverMsg' script\server_cardgame.lua:967: in function 'm_fnAct' script\eventmgr.lua:91: in function 'fun' script\std.lua:49: in function 'm_fnProc' script\state.lua:34: in function 'fun' script\std.lua:49: in function 调用栈: stack traceback: script\state.lua:62: in function (tail call): ? (tail call): ? script\eventmgr.lua:281: in function 'heartbeat' script\eventmgr.lua:357: in function 'poll' script\main.lua:151: in function [C]: in function 'xpcall' script\error.lua:15: in function 'captureLog' script\main.lua:145: in function
难怪下午公司的几个策划一直抱怨,为什么更新个服务器花了这么长时间,原来是出了问题啊:D 新的版本加入的NPC功能很受欢迎,晚上感受了一下,如果高级难度的AI如果再强一点就更加好了。同时高级难度的NPC出战的卡片貌似永远只有那么几种,难道只设定了一套卡书??

Post a comment

非这个主题相关的留言请到:留言本