windbg 分析dump文件

96
FlyingPenguin
2016.09.25 18:59* 字数 449

Windows下的程序如果设计有问题,如存在越界、访问空指针等,会出现崩溃的现象.
如下:

程序崩溃截图

崩溃的时候就需要分析原因,方便分析和后续优化程序.
此时一种方法就是用::MiniDumpWriteDump
生成dump文件(.dmp), 记录崩溃是的系统信息和堆栈信息等.
生成dump文件后,研发人员就可以用windbg工具进行分析.

  • 打开dump文件
Open Crash Dump
选择dump文件
  • 指定Symbol File Path
    指定**Symbol File Path**

    即指定符号文件(比如.pdb)所在的路径。
    符号文件包含了相关二进制文件的调试信息,以.pdb戒.dbg为扩展名。
    WinDbg使用符号文件来确定调用栈,堆及其他重要信息。

A native C++ PDB file contains quite a bit of information:

  1. Public, private, and static function addresses
  2. Global variable names and addresses
  3. Parameter and local variable names and offsets where to find them on the stack
  4. Type data consisting of class, structure, and data definitions
  5. Frame Pointer Omission (FPO) data, which is the key to native stack walking on x86
  6. Source file names and their lines

.pdb文件中包含了

  1. 共有、私有、静态函数的地址
  2. 全局变量的名称和地址
  3. 参数和局部变量的名称和在栈中的偏移量
  4. 类和结构体等定义
  5. Frame Pointer Omission (FPO) data
  6. 源文件名称及其行号
  • 分析崩溃的位置
    运行命令:
!analyze -v
!analyze -v

运行结果中最重要的就是STACK_TEXT, 用于显示崩溃时的调用堆栈信息:

STACK_TEXT

STACK_TEXT下的第一行一般最重要,可指示最终崩溃的位置:

崩溃位置

可以看出crashrpt_dempdlg.cpp文件的165行(OnBnClickedButtonCrash函数中)发生了崩溃问题.

FAULTING_SOURCE_CODE段可以查看崩溃位置的源码.

有的还可打印出源码的崩溃位置

可以看出165行代码的地方因为访问已经释放的指针而出现崩溃.

References:

https://www.wintellect.com/pdb-files-what-every-developer-must-know/

C/C++/VS2010
Web note ad 1