Windows下的程序如果设计有问题,如存在越界、访问空指针等,会出现崩溃的现象.
如下:
崩溃的时候就需要分析原因,方便分析和后续优化程序.
此时一种方法就是用::MiniDumpWriteDump
生成dump文件(.dmp), 记录崩溃是的系统信息和堆栈信息等.
生成dump文件后,研发人员就可以用windbg工具进行分析.
- 打开dump文件
- 指定Symbol File Path
即指定符号文件(比如.pdb)所在的路径。
符号文件包含了相关二进制文件的调试信息,以.pdb戒.dbg为扩展名。
WinDbg使用符号文件来确定调用栈,堆及其他重要信息。
A native C++ PDB file contains quite a bit of information:
- Public, private, and static function addresses
- Global variable names and addresses
- Parameter and local variable names and offsets where to find them on the stack
- Type data consisting of class, structure, and data definitions
- Frame Pointer Omission (FPO) data, which is the key to native stack walking on x86
- Source file names and their lines
.pdb文件中包含了
- 共有、私有、静态函数的地址
- 全局变量的名称和地址
- 参数和局部变量的名称和在栈中的偏移量
- 类和结构体等定义
- Frame Pointer Omission (FPO) data
- 源文件名称及其行号。
- 分析崩溃的位置
运行命令:
!analyze -v
运行结果中最重要的就是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/