代码(src/05/gdb.c)

int g(int x)
{
return x + 4;
} int f(int x)
{
return g(x);
} int main(void)
{
return f(8) + 4;
}

gcc编译

使用gcc -g src/05/gdb.c -o gdb -m32命令在64位的机器上产生32位汇编代码

gdb调试可执行文件

  • 使用gdb gdbdemo指令打开gdb调试器

  • 使用break main指令在main函数处设置断点,使用r指令运行代码,可以看到运行时在main函数位置停了下来

  • 使用disassemble指令获取汇编代码

  • 用i r指令查看各寄存器的值

  • 此时主函数的栈基址为0xffffcf68,用x 0xffffcf68指令查看内存地址中的值,目前%esp所指堆栈内容为0,%ebp所指内容也为0

  • 使用display /i $pc指令进行设置,在每次执行下一条汇编语句时,都会显示出当前执行的语句。

  • 依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:

    1、使用si指令单步跟踪一条机器指令

    2、使用i r指令查看各寄存器的值

    3、使用x/na %esp对应的值指令查看堆栈变化

  • %esp、%ebp和堆栈内容变化

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

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

  • 为传参做准备:

  • 实参入栈:

  • call指令将下一条指令的地址入栈:

  • 分配栈空间

  • pushl 0x8(%ebp)将%esp中的8存入栈中

  • 将 %eax 与立即数4相加

  • pop %ebp在g结束前弹栈

  • ret返回g中call的调用位置,结束g函数

  • 将 %esp 与立即数相加

  • leave返回准备栈

  • ret返回f中call的调用位置,结束f函数

  • 进入main函数,将 %esp 与立即数相加

  • 将 %eax 与立即数4相加

  • leave返回准备栈

  • ret结束main函数

  • 分析

参考

-GDB调试汇编堆栈过程分析

gdb调试汇编堆栈分析的更多相关文章

  1. 20145318 GDB调试汇编堆栈分析

    20145318 GDB调试汇编堆栈分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const sta ...

  2. 20145219 gdb调试汇编堆栈分析

    20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...

  3. 20145310 GDB调试汇编堆栈分析

    GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...

  4. GDB调试汇编堆栈

    GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...

  5. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  6. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

  7. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

  8. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  9. 20145337 GDB调试汇编堆栈过程分析

    20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...

随机推荐

  1. ajax回调中的this.href不执行跳转的解决办法

    1. 问题背景 如下所示代码: $.post("/ems/register",indata, function(data){ if(data != null && ...

  2. 使用cxf构建webservice

    一.简介 cxf是apache下的一个开源的,功能齐全的WebService框架.是由Celtix和XFire两个开源框架组合而成.cxf可以帮助我们使用前端编程模型构建和开发服务,如JAX- WS和 ...

  3. 烂泥: KVM虚拟机Linux系统增加硬盘

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. Linux虚拟机在使用过程中,硬盘空间不够使用.由于前期没有做LVM,所以只能手动添加新的硬盘. 给虚拟机添加硬盘有两种方法: 1.通过virsh at ...

  4. POJ 1961 Period( KMP )*

    Period Time Limit: 3000MSMemory Limit: 30000K Total Submissions: 12089Accepted: 5656 Description For ...

  5. Mac OS X 中vim开启配色和git补全

    问题起源:mac 下自带的git 无法补全命令,配色方案不完善 Mac OS Yosemite 10.10.3 git version 2.3.2 (Apple Git-55) 处理结果:git命令可 ...

  6. excel if判断时间段早晚班

    =IF(OR(HOUR(B3)={9,10,11,12,13,14,15,16,17,18}),"早班","晚班")

  7. Rotate Array

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  8. Codeforces Round #267 Div2 C George and Job --DP

    题意:把长度为n的序列分成k个m长的连续小序列,这些连续小序列的和最大是多少. 解法:显然DP. 定义: dp[i][j] 为前 i 个元素分成j个m端,且 i 是第j个的末尾的最大和. 那么有: d ...

  9. js fs read json 文件json字符串无法解析

    读取 xxx.txt(里面就是一段 json)-> JSON.parse( fs.readFileSync( xxx.txt ) ) -> 报 SyntaxError: unexpecte ...

  10. iOS中NSLog的输出格式

    %@ 对象%d %i 整数%u 无符整形%f 浮点/双字%x, %X 二进制整数%o 八进制整数%zu size_t%p 指针 ; NSLog(@"%p",&tem); & ...