突然的意外

模块写好后,自己测试了好几遍,又对照着策划文档和策划同事确认了一些疑问,走读了这个模块,策划验收了,测试同事也测试了。然后策划同事今天更新了该数据文档,打表后提交了,程序重新启动跑起来了,看样子很乖的。

然后接了个任务,满足了时间库中某个条件,进行跑A模块功能,然而进不去,发现程序宕了。GDB跟了一下,发现是core在了某行代码,大致意思是不知名的域,因为用的是Google开源的Protocol Buffer,看了几行帧信息,不可能是空指针。快速的看了下代码,后来就怀疑是不是数据有问题。检查了下配置文件,没啥问题。又把程序启动了,去其他点跑同样的逻辑也没啥问题。后来不得不打断点,watch变量,发现给客户端的回包的值被改了,因为中途没有被赋值,那现在很明确了,即地址的非法访问。然后就发现在协议中的枚举值最大是20,然后策划同事在配置表里写了个超过20的条件ID值,修改了协议的某些字段,所以造成了以上问题。

其实程序地址的非法访问很难发现,程序会出现未定义行为,不像空指针问题比较好查,好点的就是在测试阶段发现问题,而不是上线了导致一系列问题。唯有写代码的时候遵循良好的规范,变量在使用前先初始化,初始化指针,使用后释放资源要赋空,不然造成野指针访问非常地址,再次避免二次释放,如果在函数中申请了资源最好在另一个函数中释放资源,靠“使用该申请资源的用户”释放是很难保证的,很可能造成资源泄露。还有,在靠近变量使用它的地方定义它,延迟定义,在某种程度上减少资源的构造与析构带来的一些成本。

最近几天需要把以前的代码review下,做些重构和简单的优化。

推荐书籍:代码大全,重构-改善...【忘了书名】

你可能感兴趣的:(突然的意外)