1.Windows内存布局
2.函数调用堆栈
3.函数调用约定
4.FPO介绍
在调试程序的过程中,可能遇到过一两次“FPO”这个词。FPO是指在x86上处理编译器如何访问本地变量和基于堆栈的参数的编译器优化的一个特定类型。对于使用局部变量(和/或基于堆栈的参数)的函数,编译器需要一种机制来引用堆栈上的这些值。
通常,这是通过以下两种方式之一完成的:
- 直接从堆栈指针(esp)访问局部变量。这是启用FPO优化时的行为。虽然这不需要单独的寄存器来跟踪局部变量和参数的位置,但如果禁用了FPO优化,这会使生成的代码稍微复杂一些。特别是,由于函数调用或修改堆栈的其他指令等原因,esp中局部变量和参数的位移实际上会随着函数的执行而改变。因此,编译器必须在引用基于堆栈的值的函数中的每个位置跟踪当前esp值的实际位移。对于编译器来说,这通常不是什么大问题,但是在手工编写的汇编程序中,这可能会变得有点棘手。
- 指定一个寄存器指向堆栈上相对于局部变量和基于堆栈的参数的固定位置,并使用此寄存器访问局部变量和参数。这是禁用FPO优化时的行为。约定是使用ebp寄存器访问局部变量和堆栈参数。Ebp通常设置为第一个堆栈参数可以在[Ebp+08]中找到,而局部变量通常位于Ebp的负位移处。
5.PDB文件
6.常用调试工具
7.Dump文件
Minidump介绍
8.分析流程
- 调试方式
9.Visual Studio调试方法
(1)配置pdb路径
(2)打开dump文件
(3)开始调试
(4)未加载的pdb符号
10.WinDbg调试方法
(1)Windbg安装配置
http://www.cnblogs.com/mrhgw/archive/2011/08/22/2149849.html
(2)打开dump文件
(3)在命令窗口初步分析
!analyze -v // 分析
.ecxr // 显示异常上下文记录
(4)打开View -> Call Stack (Alt+6)与View ->Locals(Alt+3)窗口,查看细节
通过Windbug分析,可以很清楚看到如下内容:
- 崩溃简述
- 崩溃所在函数
- 崩溃原因
- 崩溃堆栈信息
- 其他信息,如内存、线程信息(需要其他命令调用)
(5)WinDbg常用调试命令介绍
11. 常见导问题总结