20145202马超GDB调试汇编堆栈过程分析

  • esc :w保存,:wq保存并退出
  • x:删除错误的单个字母
  • dw:删除整个单词
  • gcc hello.c -o hello:运行hello.c
  • gcc -g hello.c -o hello:用来调试
  • gcc -E hello.c -o hello.i:编译
  • gcc -S hello.i -o hello.s:cpp到ccl,c语言到汇编
  • gcc -c hello.s -o hello.o:ccl到as,汇编语言到机器码
  • file hello.c:查看hello文件
  • od hello.o:
  • 断点:函数断点,临时断点,b 行号,条件断点

    代码的学习


    gcc -g haha.c -o haha -m32
    gbd haha

  • frame 打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
  • info frame 打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。
  • 输入命令 disassemble ,显示出该代码(main())的汇编形式

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

  • 使用 s 单步运行程序

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

  • 该代码中,共存在过3个堆栈,对每个堆栈查询其详细信息,观察堆栈变化:
  • 由 main() 函数形成的堆zhan:

  • 由 f1 函数形成的堆栈:

  • 由 g1 函数形成的堆栈:

汇编调试

  • 1.b main(设置断点)
  • 2.r(run) 运行
  • 3.n(next),s(step)优先使用next,如果单行出错了再用step进到里面进行调试
  • 4.quit

  • until:跳过一个大循环
  • tb 14:14行驶临时断点
  • b 12 if i==5000:12行设置了一个条件断点并且在i=5000时停下来。
  • disp j:j的值每变化一次就会打印一次j
  • finish:当使用s进入到一个循环里后再使用finsih就可以直接执行完这个循环。

  • (gdb)p/x i:打印变量名为 i 的十六进制值
  • (gdb) display /3i $pc:这是一种设置,设置好了调试过程中每一步都回显一次,这里是一次显示 3 行,3 在这里是指一次显示几行,不输入,缺省为1
  • (e)xamine:功能和display差不太多,区别就是display是一种设置,每次跳命令显示一次,x是主动显示:x/
  • main 、f1、 g13个函数所对应的汇编代码:

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

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

  • 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);,进行运算。

代码托管

http://git.oschina.net/tuolemi/haha

学习进度条

最新文章

  1. 深入理解HTML表格
  2. 正确地组织python项目的结构
  3. PHP 三元运算符省略写法
  4. ubuntu14.04配置中文latex完美环境(texlive+texmaker+lyx)
  5. Android数据的四种存储方式之SQLite数据库
  6. css3圆角讲解
  7. 网络基础Cisco路由交换三
  8. 列表&元组的内置方法
  9. https://blog.csdn.net/u011489043/article/details/68488459
  10. vue项目中获取cdn域名插件
  11. 洛谷P3469[POI2008]BLO-Blockade
  12. PhpStudy升级MySQL5.7
  13. python计算文件的行数的方法
  14. SourceTree安装跳过登录
  15. Networked Graphics: Building Networked Games and Virtual Environments (Anthony Steed / Manuel Fradinho Oliveira 著)
  16. 第十九单元 nfs服务
  17. 【leetcode】441. Arranging Coins
  18. Nginx – access_log格式及配置
  19. Spring Date JPA 更新部分字段
  20. ASCII、Unicode和UTF-8编码的区别;中英文混合截取

热门文章

  1. 栅格那点儿事(四D)
  2. Programming for thread in Java
  3. android三大组件之Intent
  4. IOS开发入门你们准备好了吗?
  5. 在Markdown中插入不会显示的注释文本
  6. BZOJ 4502: 串 AC自动机
  7. IOS 控制当前控制器支持哪些方向
  8. POJ-3067 Japan---树状数组逆序对变形
  9. Robin-Karp algorithm 字符串的匹配
  10. 2017.9.28 web设计简单的购物车应用案例--session的简单应用