20145318 GDB调试汇编堆栈分析
-
代码
#include<stdio.h> short addend1 = 1;
static int addend2 = 2;
const static long addend3 = 3; static int g(int x)
{
return x + addend1;
} static const int f(int x)
{
return g(x + addend2);
} int main(void)
{
return f(8) + addend3;
}
分析过程
-
编译,产生32位汇编,进入gdb调试
-
在main处设置断点
break main
,运行r
,停在main,用disassemble
获取汇编代码 -
读取主函数的栈基址(0xffffd088)
-
依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
1、使用si指令单步跟踪一条机器指令
2、使用i r(info registers)指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
3、使用x/na %esp对应的值指令查看堆栈变化
将上一个函数的基址入栈,从当前%esp开始作为新基址: