一次调试代码的失败经历

事故背景:因为新的需求,所以在原有的代码上,一次性地改动了多个文件。初看返回的报错,定位到相应的代码,逻辑上并看不出什么问题。此程序是一个动态库,直接放在客户那边的服务器上跑,也就不能断点调试了。唯一的调试手段,就是在可疑的地方加上日志。

由于改动的地方太多,直接看相应地代码处,又死活看不出问题来。无奈,选择了用最卖力的方法:一个文件一个地替换,最终定位出问题文件,接着锁定问题代码。但是大把的时间,就这样在试的过程中浪费掉了。

代码是不会骗人的,既然出问题了,那一定是逻辑存在问题。首先放弃自己认为没有问题的想法,直接缩小范围,盯住相关的代码。看看前后的条件,为什么会执行/不执行。而不是盲目地全部回滚到上一个版本。一点点往上怼代码,一个个试。

copy代码是万恶之源呐,复制过来,很多细节你没去考虑,一不注意,逻辑就会出问题。自己挖坑,往里跳。

这次就是因为copy了两个或运算,没有注意到括号,导致原有的与运算逻辑出错。

if ((field_name.compare("entrust_no") == 0 && 
    req->funcname_.compare("queryOrder") == 0 || \
    req->funcname_.compare("cancel") == 0) || \
    boost::any_cast<int>(req->func_->id) != 332250)//
    {

    }

一个小括号的问题,不仔细去分析这段代码,直接放过,就不能轻易地发现此处逻辑的bug。结果也就会像今天这样,郁闷半天而不得解。