20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

堆栈跟踪

首先编辑一个程序

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

用gcc编译,再使用gdb调试,发现gdb尚未下载

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

下载后重新运行gdb

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

设置断点:b+行号或者“main”

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

运行:r

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

frame:打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

info frame:打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

输入命令disassemble:显示出该代码(main())的汇编形式

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

info registers,显示当前(main()处)寄存器值

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

使用s单步运行程序

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

使用 up down ,跳转不同堆栈,查询其中的堆栈简要信息

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

该代码中,共存在过3个堆栈,对每个堆栈查询其详细信息,观察堆栈变化:

由main函数形成的堆栈(#2)
20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

由f1函数形成的堆栈(#1):

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

由g1函数形成的堆栈(#0):
20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

堆栈调试

main 、f1、 g13个函数所对应的汇编代码:

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

设置display ,每一步显示一行代码,查看当前 main() 断点处初始的寄存器值(主要观察%eax,%ebx,%esp,%eip)

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

printf("%d\n,f1(1)+6);,转到fi函数地址处:

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

int f1(int x){,建立f1函数的堆栈,保存数据,更新信息,return g1(x),保存f1函数的数据,之后跳转到g1函数的地址,int g1(int x),建立g1函数的堆栈,保存数据,更新信息,return x+5;,进行计算,},销毁g1函数的堆栈,并且回到从f1函数跳出来的下一条指令,},销毁f1函数的堆栈,并且回到从main函数跳出来的下一条指令,printf("%d\n,f1(1)+6);,进行运算。
20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析

上一篇:[转]XCache 3.0.0 发布,PHP 性能提升方案


下一篇:linux一台服务器配置多个Tomcat