为了测试windbg有多么牛逼,所以仅仅只是测试一下,属于事后诸葛亮型,也只是为了验证一下,把此方法学会即可。
模拟场景:
软件运行后,点击按钮,直接崩溃掉,什么提示都没有。因此,我们写一个wpf程序,调用c++的dll,然后点击按钮,直接崩溃,生成dmp,然后分析dmp文件。
1.使用c++写一个dll
崩溃的代码如下,我们只是为了创造崩溃的代码环境
然后生成dll
2.创建一个wpf程序
使用非托管方式调用c++的Project1.dll
3. 因为软件会自动崩溃,所以使用bat命令去捕捉dmp文件
这是启动bat
@echo off
echo 正在启用Dump...
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "D:\CrashDump" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
echo Dump已经启用
pause
@echo on
名称:DumpCount
,类型:REG_DWORD
,最大保留Dump个数,默认为10。
名称:DumpType
,类型:REG_DWORD
,Dump类型(1-Mini dump, 2-Full dump),默认为1。
名称:DumpFolder
,类型:REG_EXPAND_SZ
,Dump文件保存的位置。
4.这是停止bat
@echo off
echo 正在关闭Dump...
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /f
echo Dump已经关闭
pause
@echo on
5.双击开始的bat命令
乱码了。。。。不影响
6.启动wpf程序,点击按钮,程序会自动的崩溃
7.在存储的路径中会看到生成的dmp文件
8.使用windbg打开dmp文件
9.此处就比较有意思了
因为我测试了好几次
第一次:输入!t,就已经能看到异常了,当然是因为程序比较简单,而且我也专门写的这个错误,空引用异常了,非常的准确。
以上代码报错的是如下
第二次(本案例):输入!t,也能看到异常,但是异常是BadImageFormatException,明显是不对的,但是点击进去的话,也可以看到是MessageBoxShow方法报错的
这里要说明一下第一次和第二次:CrashFunction和MessageBoxShow方法里面的内容都是
出现这种错误类型的提示,因为生成的c++的dll,我采用了不同的方式生成的,所以同样的代码,报错的类型不一样,但是最终指定报错的地方是一样的。
10.其实最简单的就是点击一开始运行的地方
!analyze -v
里面把错误的代码已经标记好了
11.本案例只是为了验证一下流程是否走的通,实际现场环境肯定更加的复杂,分析此种问题,需要大量的dmp,然后从实践中提取方法和经验。
本案例的代码
https://download.csdn.net/download/u012563853/88523484
捕捉windbg命令
https://download.csdn.net/download/u012563853/88523541
来源:使用WinDbg分析软件突然崩溃的问题-CSDN博客