GDB调试汇编分析

GDB调试汇编分析

代码

  • 本次实践我参照了许多先作了的同窗的博客,有卢肖明,高其,张梓靖同窗。代码借用的是卢肖明同窗的代码进行调试运行。linux

    GCC编译

  • 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码
  • 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议你们使用张梓靖同窗使用的cgdb工具,由于使用时能够随时看到本身的源代码,看到咱们的断点在哪里,每一步返回值到了哪行,更加直观。编程

分析过程

  • 使用b main指令在main函数处设置断点,而后,使用r指令运行代码,使用disassemble指令获取汇编代码
    sass

  • 使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置
    函数

  • 可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0
  • 用i r指令查看各寄存器的值
  • 依次以下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
  • 一、使用si指令单步跟踪一条机器指令
  • 二、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
  • 三、使用x/na %esp对应的值指令查看堆栈变化

  • 将上一个函数的基址入栈,从当前%esp开始做为新基址:
    工具

  • call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:
    学习

  • 实参准备入栈:

  • 实参的计算在%eax中进行:

  • 将栈中的数据push

  •   push后寄存器中的值发生转变。

  • 函数f修改了%esp,用leave指令恢复。
    spa

  • ret结束main函数
    3d

总结反思

  • 此次学习让我对于gdb有了更加深入地认识,设置断点是咱们在进行编写代码时在总体编译没有问题,可是却没法获得咱们想要的结果时所进行分段纠错步骤,此次的实践让我对于堆栈变化了有了更加深入的理解,在使用终端三件工具编程时,没有编程软件上自带写好咱们拿来就用的断点设置按钮,以后如果遇到这样的问题咱们只能本身动手去作,因此说此次的实践又是咱们掌握的一件有力的linux中C语言编程工具。

gdb调试分析汇总表


相关文章
相关标签/搜索