作者:gfree.wind@gmail.com

博客:blog.focus-linux.net     linuxfocus.blog.chinaunix.net
当程序crash的时候,我们可以通过coredump文件,来定位问题。比如使用bt命令可以完整的展开函数的调用栈。但是有些时候,部分栈的数据可能被损坏,导致gdb无法直接显示函数的调用栈。那么这时就需要我们手工展开函数栈。
关于x86的函数调用栈的示意图基本如下图所示:
关于参数的压栈顺序,上图为cdecl方式,这个可以通过编译选项修改。GCC默认使用cdecl。
下面看一下例子:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. static int test(int a, int b, int c)
  4. {
  5. return a+b+c;
  6. }
  7. int main()
  8. {
  9. int a = 1;
  10. int b = 2;
  11. int c = 3;
  12. int d = test(a, b, c);
  13. printf("%d\n", d);
  14. return 0;
  15. }
编译:gcc -g -Wall test.c
进入test,查看函数调用栈:
  1. Breakpoint 1, test (a=1, b=2, c=3) at test.c:7
  2. 7 return a+b+c;
  3. Missing separate debuginfos, use: debuginfo-install glibc-2.11-2.i686
  4. (gdb) bt
  5. #0 test (a=1, b=2, c=3) at test.c:7
  6. #1 0x08048412 in main () at test.c:16
那么现在查看一下寄存器:
  1. eax 0x1 1
  2. ecx 0x2c0187d8 738297816
  3. edx 0x1 1
  4. ebx 0x73fff4 7602164
  5. esp 0xbffff048 0xbffff048
  6. ebp 0xbffff048 0xbffff048
  7. esi 0x0 0
  8. edi 0x0 0
  9. eip 0x80483c7 0x80483c7 <test+3>
  10. eflags 0x286 [ PF SF IF ]
  11. cs 0x73 115
  12. ss 0x7b 123
  13. ds 0x7b 123
  14. es 0x7b 123
  15. fs 0x0 0
  16. gs 0x33 51
得到ebp的地址为0xbffff048,现在检查这个地址的内存
  1. (gdb) x /8x 0xbffff048
  2. 0xbffff048: 0xbffff078 0x08048412 0x00000001 0x00000002
  3. 0xbffff058: 0x00000003 0x0073fff4 0x00000001 0x00000002
下面分析一下这些内存的内容:
1. 0xbffff078:为test的调用者,即main函数的bp地址;BP地址即为该函数的栈顶指针。
2. 0x08048412:为test的返回地址,与前面的bt的输出相符;
3. 后面的0x00000001,0x00000002,0x00000003,为传给test的三个参数,且参数顺序为由右向左压栈——注意这个顺序是可以通过改变编译参数改变的。
回到main中,验证一下bp寄存器的内容:
  1. 0x08048412 in main () at test.c:16
  2. 16 int d = test(a, b, c);
  3. Value returned is $2 = 6
  4. (gdb) info registers
  5. eax 0x6 6
  6. ecx 0x39ff7a48 973044296
  7. edx 0x1 1
  8. ebx 0x73fff4 7602164
  9. esp 0xbffff050 0xbffff050
  10. ebp 0xbffff078 0xbffff078
可见BP的地址确实为0xbffff078,与之前的分析相符。
注:关于压栈顺序,参数的传递方式等等,都可以通过编译选项来指定或者禁止的。本文的情况为GCC的默认行为。

如何手工展开函数栈来定位问题相关推荐

  1. 【C语言】二十二步了解函数栈帧(压栈、传参、返回、弹栈)

    阅读本文需要掌握的知识 熟练使用--c语言函数 进入正题前 首先我们为什么要学习函数的栈帧? 简单回答就是:增加内功 学习函数调用的底层代码,了解函数如何传参.如何返回 这样对于函数的使用有很大的帮助 ...

  2. 通过/proc查看Linux内核态调用栈来定位问题

    文章目录 1.定位一个"运行慢"的进程 2.strace -cp 27288 3. pstack 27288 3.进程状态和WCHAN字段 4.进程有什么活动或者完全挂死了? 5. ...

  3. 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)

    文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...

  4. 函数调用过程详解:函数栈帧的创建与销毁

    前言:我们在学习C语言的过程中,可以会产生很多疑问,比如: 局部变量是怎么创建的 为什么局部变量的值不做初始化就是随机值 函数是怎么传参的?传参的顺序是怎么样的? 形参和实参是什么关系? 函数调用是怎 ...

  5. 递归和函数栈与setjmp和longjmp的关系

    递归每执行一次都会释放一次函数栈 setjmp 记录函数栈的栈顶 longjmp 寻找函数栈的栈顶 如果longjmp找到了他要寻找的函数栈顶 调用setjmp的函数栈不会被释放 所以setjmp 和 ...

  6. scala tail recursive优化,复用函数栈

    在scala中如果一个函数在最后一步调用自己(必须完全调用自己,不能加其他额外运算子),那么在scala中会复用函数栈,这样递归调用就转化成了线性的调用,效率大大的提高.If a function c ...

  7. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

    上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...

  8. 函数栈帧的创建和销毁图解

    目录 一.问题: 二.寄存器 栈区 1.寄存器有哪些?有什么作用? 2.编译环境 3.栈区的使用习惯: 4.main函数也是被其他函数调用的 5.汇编代码 三.为main函数创建栈帧 1.main函数 ...

  9. c++ 写x64汇编 5参数_第9篇-C/C++ x86_64的函数栈

    这是程序栈话题的最后一篇,可能有人会问,你前面5篇写那么多x86程序栈的文章干什么?请耐心看下去,即便现在x64硬件流行的今天,x86的过程调用约定仍然有存在的现实意义,这个戏说程序栈的最终篇,我们探 ...

最新文章

  1. [转载]Python爬虫入门三之Urllib库的基本使用
  2. LeetCode35.搜索插入位置
  3. python多线程爬虫界面_多线程网页爬虫 python 实现
  4. 矩阵的乘法通用模板(C++/Java)
  5. php flash chart,openflashchart 2.0 简单案例php版
  6. qt中判断对象是否为空的方式
  7. ANTLR VS FLEXBISON
  8. yum方式安装android_linux yum 命令 详解
  9. Android多媒体学习八:调用Android自带的音频录制程序,实现录制
  10. JavaScript中必须掌握的10个难点(必看)
  11. freebsd mysql utf8_FreeBSD环境下Mysql问题解决方法集锦
  12. Linux内存分配器SLOB,深入理解Linux内核之SLOB分配器
  13. imx6 rtl8821cs wifi驱动调试
  14. 大牛直播SDK-Windows推送端使用说明
  15. 2手房地产营销企划书
  16. 删除文件时提示正在被使用无法删除问题/删除dll文件
  17. 汽车维修企业管理【15】
  18. 网易云信 android,Android 网易云信集成(一)
  19. 微信小程序——手机号登录
  20. 数据结构中的“阴”和“阳”

热门文章

  1. ORA-04063: view SYS.DBA_REGISTRY has errors
  2. 每天工作四小时的程序员-转
  3. 使用FileZilla Server快速搭建本地FTP服务器
  4. c、c++---linux上的GetTickCount函数
  5. 打造新型智慧城市标杆 金华跻身中国城市信息化50强
  6. Node.js学习笔记(一)
  7. Cisco/H3C交换机配置与管理完全手册(第2版)卓越网正式到货
  8. 个人管理:简单,我微博中的一句话,总有你喜欢的
  9. 《SQL入门经典》学习笔记
  10. 尽快安装修补程序!微软 Word 漏洞影响上百万人