事后调试有两个最基本的目标:1发现程序是在哪里崩溃的;2找出导致程序崩溃的原因。简单地说,就是要找到程序中导致崩溃的指令地址。
转储文件是进程状态的一个静态快照。因此,在转储文件上设置断点并进行单步调试是不可能的。
通过转储文件来进行调试可以作为一种手工调试方式。在手工调试方式中,我们只能查看机器的状态,你需要手工分析在程序中究竟是执行也怎样的代码才使得程序达到现有的姿态。显然,通过状态分析来构造代码的执行流程比在实时调试中分析代码流程要更为困难。然而,在使用转储文件时,我们仍然可以通过大量的调试命令来将程序的状态转换为一种易于分析的形式;并且在大多数情况下,只要有足够的耐心,总会找出问题的根源。
windbg命令
切换栈帧:.frame 切换栈帧,如.frame 1
查看类型指令: dt,如 dt this
查看栈指令: k,如
显示局部变量: dv。显示本层局部变量信息
线程相关: ~
显示汇编指令: u
u 向下反汇编
ub向上反汇编
uf反汇编整个函数
写入汇编指令: a
显示进程/线程环境参数(!peb 和 !teb 命令)
dps 显示堆栈的所有内容
windbg基本使用
1.set
1.1 设置Symbol file path
file->symbol file path,
如:本应用pdb
1.2 设置source file path
file->source file path
如:本应用源码目录
2.开始
2.1将dmp文件拉至windbg界面
2.2输入命令,开始自动分析
!analyze -v
2.3详细报告
通过上面得到的简要报告,找到这一行,不一定文字一样,
如:stack_command: ~13; .ecxr; kb
将上面的命令输入,得到详细信息
再通过View->locals,可以看局部变量