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

出在 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 <script\std.lua:48>
调用栈:
stack traceback:
script\state.lua:62: in function <script\state.lua:57>
(tail call): ?
(tail call): ?
script\eventmgr.lua:281: in function 'heartbeat'
script\eventmgr.lua:357: in function 'poll'
script\main.lua:151: in function <script\main.lua:146>
[C]: in function 'xpcall'
script\error.lua:15: in function 'captureLog'
script\main.lua:145: in function <script\main.lua:143>

难怪下午公司的几个策划一直抱怨,为什么更新个服务器花了这么长时间,原来是出了问题啊:D 新的版本加入的NPC功能很受欢迎,晚上感受了一下,如果高级难度的AI如果再强一点就更加好了。同时高级难度的NPC出战的卡片貌似永远只有那么几种,难道只设定了一套卡书??

Post a comment

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