一般程序在Debug的模式下发生异常和死锁,我们通过编译很容易找到问题。
但是在Release模式下呢,还有特定的环境下才出现的BUG我们怎么办呢?
1、在Debug模式下,建立和客户一样的环境,复现问题,通过调试能找到。前提条件:客户的环境研发人员可以搭建并且问题可以复现。
2、如果1不可行,我们通过写日志的方式或者输出信息到Debugview方式,来大概定位问题的位置。
还有一个更好的办法来抓取错误信息,并且定位错误位置,就是通过Adplus工具抓取dump文件,windbg进行分析。
Adplus工具在安装windbg后跟windbg.exe在同一目录下。
Adplus主要有2种模式捕获信息。一种是在程序出现崩溃crash时捕获,还有一种是程序出现死锁hang时捕获。
下面列举2个最简单的调试参数
分别对应的启动参数是:
adplus -crash -pn<进程名> -o D:/dump 捕获进程崩溃crash信息,并把dump文件放入D:/dump文件夹中
adplus -hang -pn<进程名> -o D:/dump 捕获进程死锁hang信息,并把dump文件放入D:/dump文件夹中
提示:捕获crash时要先启动adplus,来捕获崩溃,否则程序都崩溃了也捕获不到了。
捕获hang时可以等到死锁出现时再运行adplus来捕获。
提取到dump文件后,通过windbg打开dump文件,分析堆栈就可以看到出错问题的位置了,最好可以把Pdb文件和source文件一起加入windbg就可以更一目了然了。
相关操作图片:
打开adplus设置
运行unittest崩溃后保存的dump文件
windbg分析的dump文件内容,查看堆栈情况