单步到崩溃地点,有数组取数据和拷贝操作,猜测数组越界导致的栈溢出。就开始找越界检查工具。
vs自身带的/GS只是在栈溢出时蹦个异常,不会给你定位崩在哪。所以找了会儿别的工具,boundschecker还没找到下的地方,IBM的purify跨平台但是收费,另外免费好用的就是linux下的valgrind了。这几种内存检查工具都可以检查内存泄露和越界之类的。只是项目现在赶进度,linux平台的编译还没时间解决,内存统一检查就作罢。
开始看看能不能查dump。dump不是原生的dmp而是历史代码里重存为别的了。vc调试不很熟练,就索性把重存dump那块儿的catch给干掉了。直接让编译器崩到代码块儿再看看能不能看出什么问题。
崩停到具体代码行了,很惊喜,赶紧看看各变量内存状况,问题数组是一个指针数组,这次惊喜的发现之前单步的那个下标对应在数组元素指针跟别的不一样,为0xcdcdcdcd,确认了下为vc下为未初始化的指针。
这样就好查了,问题定位到了,后边的就不啰嗦了。
最终问题是,同事给一个类新加了几个指针成员,但是这几个没有new出来初始化之。唉……只能感叹下敏捷开发那本书里说的,架构师要参加编码,我觉得要加点儿,就是架构师要参与编码还要参与测试调试自己的代码。