GDB调试汇编堆栈分析

代码:

             

           sudo apt-get install libc6-dev-i386命令安装所需库

    • 进入之后先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:

    • 可见此时主函数的栈基址为0xffffd098,用x(examine)指令查看内存地址中的值,目前%esp所指为0,%ebp为0

    • 下面展示每一步时%esp、%ebp和堆栈内容的变化:

    • i

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

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

    • 先为传参做准备:

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

    • 实参入栈06

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

计算short+int

pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:

pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:

ret指令将栈顶弹给%eip:

因为函数f修改了%esp所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:

  • 主函数汇编代码,并结束栈帧的调用。
指令 esp ebp 堆栈
push $0x8
0xffffd098  
0xffffd098 0x0
call 0x80483ef
0xffffd094  
0xffffd098 0x8 0x0
push %ebp
0xffffd090  
0xffffd098 0x8048412 0x8 0x0
mov %esp,%ebp 0xffffd08c 0xffffd098 0xffffd098 0x8048412 0x8 0x0
mov 0x804a01c,%edx 0xffffd08c 0xffffd08c 0xffffd098 0x8048412 0x8 0x0
 mov 0x8(%ebp),%eax  0xffffd08c  0xffffd08c

0xffffd098 0x8048412

0x8 0x0

 add %edx ,%eax  0xffffd08c 0xffffd08c  0xffffd098 0x8048412 0x8 0x0
 push %eax  0xffffd08c  0xffffd08c  0xffffd098 0x8048412 0x8 0x0
 call 0x80483db<g>  0xffffd088  0xffffd08c  0xa 0xffffd098 0x8048412 0x8 0x0
 push %ebp      0xffffd084  0xffffd08c  0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 move %esp %ebp  0xffffd080  0xffffd08c  0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 movzwl 0xffffd080       0xffffd080  0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 movswl %ax %edx  0xffffd0080  0xffffd080  0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 mov 0x8(%ebp),%eax  0xffffd080  0xffffd080  0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 add %edx %eax  0xffffd080  0xffffd080

0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
pop %ebp 0xffffd080 0xffffd080 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
ret 0xffffd084 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
add $0x4 ,%esp 0xffffd08 0xffffd08c 0xa 0xffffd098 0x8048412 0x8 0x0
leave  0xffffd08c 0xffffd08c 0xffffd098 0x8048412 0x8 0x0
ret 0xffffd090  0xffffd098 0x8048412 0x8 0x0
add $0x4 ,%esp 0xffffd09 0xffffd098 0x8 0x0
leave 0xffffd098 0xffffd098 0x0
ret 0xffffd09c 0x0  

gdb汇编调试的更多相关文章

  1. GDB中汇编调试

    GDB中汇编调试 1.输入代码 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,时遇到问题使用-m32指令报错,参考卢肖明同学博客知道这是 ...

  2. GDB堆栈跟踪与汇编调试

    GDB堆栈跟踪与汇编调试 堆栈跟踪 源代码: 对预先编写的 stack.c 文件进行编译,并且使用 CGDB 进行调试,对堆栈进行跟踪,了解该代码堆栈是如何变化的. 在 CGDB 中,先设置 main ...

  3. GDB 单步调试汇编

    本文同时发表在 https://github.com/zhangyachen/zhangyachen.github.io/issues/134 之前在看汇编的时候一直是肉眼看GCC -S的结果,缺点是 ...

  4. gdb命令调试技巧

    gdb命令调试技巧 一.信息显示1.显示gdb版本 (gdb) show version2.显示gdb版权 (gdb) show version or show warranty3.启动时不显示提示信 ...

  5. Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

    姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...

  6. Linux gcc和gdb程序调试用法 {转}

    gcc一般调试格式: gcc -Wall -o  test   test.c // -wall  显示程序错误详细信息      gcc -v  // 显示gcc的版本 gcc -o{1,2,3} t ...

  7. ARM平台如何玩转GDB远程调试?

    前  言 关于GDB工具 GDB工具是GNU项目调试器,基于命令行使用.和其他的调试器一样,可使用GDB工具单步运行程序.单步执行.跳入/跳出函数.设置断点.查看变量等等,它是UNIX/LINUX操作 ...

  8. gdb可以调试python的pdb么

    1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...

  9. Window平台Grmon下如何使用gdb进行调试

    Window平台Grmon下如何使用gdb进行调试 1输入cmd命令,打开其窗口,进入你要执行的文件目录下 2.连接开发板,输入grmon –altjtag –u 3.连上后,输入gdb命令 4.再输 ...

随机推荐

  1. Opera浏览器导出收藏到Chrome,和几个Chrome的一些小技巧

    Opera浏览器还是不错的,但是用着不是特别爽,老是感觉怪怪的,也说不上来哪里不好. 还是换回了Chrome浏览器,Chrome浏览器有一个让我念念不忘的地方,就是收藏夹会自动显示,当打开网页之后,又 ...

  2. 【转】Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing

    最近在看Java,在编译写书上一个例子时,由于书上的代码只有一部分,于是就自己补了一个内部类.结果编译时出现:No enclosing instance of type E is accessible ...

  3. tomcat从 http转成https,并且去掉端口号

    将 <Connector port=" URIEncoding="UTF-8"/> 改成 <Connector port=" URIEncod ...

  4. rabbitmq, windows/linux, c/c++/node.js/golang/dotnet

    官网:http://www.rabbitmq.com/ zeromq 相当于 message backbone,而rabbitmq相当于message broker.有的应用系统中,二者并存. (1) ...

  5. SSL/TLS算法流程解析

    SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description ...

  6. 如何在 IDEA 中使用Maven 及 相应插件

    1,Maven 面板 Root ,相当于 VS 中的 sln ? ,大概可以这样理解吧. clean  --> install  这样操作, 所有的项目都会被执行. 手工操作有点麻烦.换另一种方 ...

  7. MySql中常用的hint

    对于经常使用Oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在MySQL里,也有类似的hint功能.下面介绍一些常用的. 强制索引 FORCE ...

  8. Gridview 分多页时导出excel的解决方案

    在开发会遇到将gridview中的数据导入到excel 这样的需求,当girdview有多页数据时按照一般的方式导出的数据只可能是当前页的数据,后几页的数据还在数据库内,没有呈现到页面上,传统的方式是 ...

  9. linux tar

    转自:http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压 ...

  10. JAVA NIO简介-- Buffer、Channel、Charset 、直接缓冲区、分散和聚集、文件锁

    IO  是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. Java标准io回顾 在Java1.4之前的I/O系统中,提供 ...