本文无图,只提供一个思路,算是这两天处理问题的一个心得,供参考。
最近两天工作中出现了一个非必现的BUG ,由于是内部使用的PE文件,每次测试都需要签名,如果DEBUG模式会非常麻烦,因此采用分析dump信息的方式。
(VS程序怎么生成dump,搜一下配置即可)
用WinDbg 打开 dump文件(再搜,有非常多的教程,只看打开和配置符号就行)
Open crash dump - > 打开dump文件
Sysbol path file -> 配置pcb文件路径 (随便选个路径,把pcb扔到里边就行)
如果你的解决方案里 有多个项目,并且互相有依赖 ,把运行的那个对应的pcb扔进去就行了
(什么?没有pcb,……,自己搜一下怎么配置)
导入dump文件后,如果有让你 .ecxr 就执行这个,没有的话就 执行!analyze -v
kv查看堆栈 缺少符号就重新导入 pcb ,再去 .reload
ld 名字无后缀,查看符号有没有被加载
只要符号加载上了,就能看出错误信息出现在哪一处了,具体问题,去程序里具体分析就好。
我本次遇见的是非必现的BUG
出现在指针reset(new )问题上,期初以为是new的问题,更改成new(nothrow)依旧无效,
那可能就不是new的问题, 去看new的那个对象的构造函数,是否有出现崩溃,本次排查是
指针没有初始化。
由于没有初始化,指针指向未知,可能指向的可访问地址,也可能是不可访问地址
后续如果有对指针的判断,那可能出现非必现问题。
开发工作一定严禁,一行疏忽,排查起来可能要用一天时间