Dump工具抓取堆栈信息
1、安装工具WinDbg
下载后,双击 dbg_amd64.msi 运行即可,会自动安装到系统。
2、配置WIN系统注册表
- 将下方脚本内容复制粘贴到txt文本,修改保存的路径信息(原
D:\dump
,需要建立文件夹换成自己的路径),然后保存为.bat
脚本文件。 - 右击脚本,使用管理员权限运行脚本,配置Dump需要的配置信息。
- 在cmd窗口中打开regedit,找到“
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
“路径可以查看配置的结果。
脚本内容介绍
@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:\dump" /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已经启用
参数说明:
DumpFolder dump文件生成路径 eg:C:\xxx
DumpType
0 = Create a custom dump //自定义dump
1 = Mini dump //mini核心dump文件
2 = Full dum //所有dump文件,产生的文件较大
DumpCount 默认:10
3、生成dump文件(.dmp)
运行测试的程序,程序崩溃后自动生成.DMP文件到 D:/dump(脚本中设定的)路径
4、用WinDbg分析.dmp文件
4.1、打开关闭.dmp文件
- 运行WinDbg软件,然后按【Ctrl+S】弹出符号表设置窗
- 将符号表地址:SRVC:\Symbolshttp://msdl.microsoft.com/download/symbols 粘贴在输入框中,点击确定即可。
注:红色字体为符号表本地存储路径,建议固定路径,可避免符号表重复下载。
- 当你拿到一个dmp文件后,可使用
【Ctrl+D】
快捷键来打开一个dmp文件,或者点击WinDbg界面上的【File=>Open Crash Dump…】按钮,来打开一个dmp文件。第一次打开dmp文件时,可能会收到如下提示,出现这个提示时,勾选“Don’t ask again in this WinDbg session”,然后点否即可。
- 当你想打开第二个dmp文件时,可能因为上一个分析记录未清除,导致无法直接分析下一个dmp文件,此时你可以使用快捷键
【Shift+F5】
来关闭上一个dmp分析记录。
4.2、使用命令分析
1、使用 !analyze -v
命令进行分析
-
输入命令:
-
在 WinDbg 的命令窗口(通常在窗口的下部),输入以下命令并按回车键:
!analyze -v
-
-
查看分析结果:
- WinDbg 会开始分析 dump 文件,并在命令窗口中显示详细的崩溃原因报告。
- 这个报告包括了崩溃的简要信息、异常代码,以及调用堆栈(Call Stack)。
- 您可以在报告中找到崩溃发生的位置,导致崩溃的代码行,以及相关的上下文信息。
可以看到堆栈调用信息,具体是Test()函数中,0x00005空指针NULL_POINTER_READ问题。
MANAGED_STACK:
SP IP Function
0000009BB01FE3D0 0000000000000001 xxxxx!Program.Test(IntPtr, Int32, System.String, Int32, UInt16)+0x2
0000009BB01FE510 00007FFD28F010FD xxxxx!Program.Main()+0x86d
MANAGED_STACK_COMMAND: !do 0000000000000000
FAULTING_THREAD: 000000000000c150
BUGCHECK_STR: APPLICATION_FAULT_NULL_POINTER_READ_WRONG_SYMBOLS
PRIMARY_PROBLEM_CLASS: NULL_POINTER_READ
DEFAULT_BUCKET_ID: NULL_POINTER_READ
LAST_CONTROL_TRANSFER: from 00007ffd3f51ac8e to 00007ffd9d26146c
STACK_TEXT:
2、查看调用堆栈
- 检查调用堆栈:
-
分析完成后,您可以使用
k
命令查看详细的调用堆栈。堆栈会显示函数调用的顺序,可以帮助您定位崩溃发生时的具体代码位置。 -
输入
k
并按回车:k
-
WinDbg 会显示一个调用堆栈列表,帮助您追踪到崩溃发生的源头。
-
3、进一步分析
- 检查寄存器和内存:
-
使用
r
命令检查崩溃时的寄存器状态。 -
使用
!address
命令检查特定内存地址的详细信息。
-
- 调试您的代码:
- 通过查看调用堆栈和相关代码,检查是否存在空指针解引用、内存泄漏、线程同步问题等,找到并修复崩溃原因。
参考博客
https://blog.csdn.net/xiao_yi_xiao/article/details/121750283
https://blog.csdn.net/qq_58397358/article/details/128388922