《娃娃遇到兵》bug记录

bug1,
时间:2012-12-23,后半夜
解决用时:半小时
故障表现:测试环境没问题,上线后再打开排行榜时服务器当机,后来定位到发送某个排行榜数据
中的玩家头像超链接时,很快发现是由于工作环境的超链接字符串大小超出定义数组的大小,
而测试环境中超链接字符串都很短,所以没出现问题。

解决办法:
1,加大字符数组大小,使之足以容纳超链接字符串
2,不再同时发送多个超链接字符串,而是分多次发送

=================================================================================
bug2,
出现时间:2012-12-24
解决用时:三天
故障表现:服务器频繁卡住的bug,用gdb调试,多停在加密类的构造函数中,
开始猜测是多线程访问同一个加密算法类实例引起的内存冲突,
后来了解了如何调试线程,调试到了故障现场,看到了故障线程的堆栈和变量值,
在调用堆栈的倒数第三帧,memcpy的目标指针的偏移值已经很大,
超出目标指针有效内存,至此知道故障原因是发送消息时,大量数据没有及时发送出去,
导致消息数据累积,消息包数据大小超出消息包定义大小。

解决办法:
1,加大消息包定义大小;
2,在添加消息时判断是否超出大小,如超出则不填充消息
3,发送失败,如果返回EAGAIN,则重试5次,如果消息数据大小超过128个字节,
    表示可能已失败多次,则不重复发送。如果消息数据大小已超过2K,
    表示发送失败太多次,丢弃消息数据

遗留问题:
1,发送失败时是否有比丢弃消息数据更好的办法
2,有时返回EPIPE错误,尚未仔细考虑处理方法,而是直接丢弃消息数据。

=================================================================================
bug3,
出现时间:2012-12-27
解决用时:两周
故障表现:服务器当机bug,一直未找出重现bug的操作规律,bug的出现时隐时现,有时两三天
出现一次,有时一天出现几次。为此学习了linux下如何写守护进程的脚本。后来发现似乎在
两人对战时其中一个退出的情况下更易出现。为此加了对SIGSEGV信号的捕捉,这样可以在服务器
当机时将调用堆栈写进日志。发现多数停在查询数据库的api,开始猜测是调用mysql的api后没有
执行释放操作导致内存占用过多,在学习了linux下查看系统内存以及进程内存的命令后发现在
游戏中每次查看排行榜时内存会上涨,检查发现查询排行榜数据后果然没有释放内存。
但在加了释放操作后当机bug仍然存在,在尝试了几个内存检查工具后,经朋友推荐决定使用
valgrind,很快定位到导致内存错误的地方,至此查明故障原因是两人对战时一人对出,系统
派一个机器人代替退出一方,和另一方继续战斗,在把玩家数据拷贝给机器人时,用memcpy
直接拷贝了一个结构的数据,其中包括指针。之后释放了玩家数据占用的内存,导致机器人的
数据结构中的指针成了野指针,指向的内存已被释放。

解决办法:
在拷贝出问题的数据结构时,为结构中的指针申请内存,将对应内存数据拷贝给目标指针。

=================================================================================
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值