调试dmp文件的方法整理
调试dmp文件
添加目录
- Symbol File Path: .pdb文件
- Source File Path: 源代码
- Image File Path: .dll文件
基本流程
加载步骤
- STEP 1:打开Windbg,在file中选择open crash Dump来打开所需要调试的Dump文件。
- STEP 2:在file菜单中分别设置好Symbol file path 和 Source file path。
- 其中Symbol file path是程序编译时所生成的pdb文件
- STEP 3:设置完这些之后,就可以在command窗口中使用Windbg的命令行来进行各种调试分析了。
- 如果有pdb文件的话,尽可能的保证pdb文件和产生Dump文件的程序版本是匹配的。
- 尽可能地保证所用来分析的源代码和程序版本是匹配的。
- 如果上述有不匹配的情况,很有可能导致分析时所得到的结果不是正确的,或者是在通过地址偏移定位出现异常代码的行数时导致定位不准确。
基本分析步骤
- !analyze -v命令使用
如果想要严谨的分析crash根因,我们需要借助dump文件(转储文件)得到下列信息:
重要指令
-
.exr (Display Exception Record)
-
.cxr (Display Context Record)
-
异常发生的地方 (地址、源码文件和代码行)
-
异常发生时的调用堆栈,通过.cxr命令
-
调用堆栈上函数参数和本地变量的值,通过k命令以及d命令
-
想要得到这三个信息,最重要的一步就是得到函数执行异常时的上下文环境,通过 .cxr 命令可实现。
步骤一: 获取异常原因
步骤二: 切换上下文
STACK_COMMAND和CONTEXT字段,都给出了分析堆栈重要前提
.cxr 0x2afb08 用来显示上下文记录,0x2afb08 是上下文记录地址,这个命令很重要,只有切换到出问题时的上下文记录,才能分析堆栈信息。
windbg入门教程之crash分析步骤_Keep Moving~-CSDN博客_windbg分析崩溃
步骤三: 显示调用栈信息
与此同时,我们可输入kb命令,显示函数调用栈过程
为了清楚看到函数入参,我们建议使用kP命令
还有其他的本地变量或者全局变量需要分析,我们可使用d命令,比如dt命令或者dv
附加到进程
- 设置好,exe极其pdb, 放置在同一个目录, 或者windbg可以找到的.
- 打开windbg, F5运行.
- 当遇到断点或进程异常时, 控制权回到windbg, 这时,
- 点击工具栏的callstack 命令,
- 打开堆栈窗口, 可以看到函数调用堆栈,
- 点击这个新CallStack窗口里的Source命令, 可以显示出堆栈里的函数对应的源文件所在的位置及行号.(如果你的源文件恰好放在这里的话, 就直接转到你的源文件里了.)
- 打开callstack窗口还提供了很多别的信息可以查看, 比如FuncInfo 可以看到该函数的调用约定 stdcall, Frame nums可以看到帧编号. SourceArgs, 可以看到原始的参数.
指令 ^694326
!analyze -v
:自动分析并生成异常报告.cls
清除windbg调试窗口内容.frame
设置进入某个函数栈,可用于显示当前栈中的局部变量~
显示或者切换线程信息(~* 1),可以配合其他命令执行(*kn)~*kbn
:查看所有的线程kbn
列出当前的调用堆栈k
显示当前线程的堆栈, 例如kb
kp
,kn
,这些后缀控制了显示的格式和信息d
用于显示内存信息,比如da,dd等等dd
:d*
命令显示给定范围内的内存内容。dd,双字值 (4 个字节为单位)。默认计数是 32 dword 值 (128 个字节)dt
: 用于显示类型,包括局部变量、全局变量、联合体和结构体.exr
命令显示异常记录的内容。.cxr
显示上下文记录信息!locks
显示死锁