在使用gdb调试时,经常要用到查看堆栈信息,特别是在内核调试时,这

显得尤其重要。通过gdb的堆栈跟踪,可以看到所有已调用的函数列表,以及
每个函数在栈中的信息。
---------------------------------------------------------------------------------
一,简单实例。

  1. #include <stdio.h>
  2. int sum(int m,int n)
  3. {
  4. int i = 3;
  5. int j = 4;
  6. return m+n;
  7. }
  8. int main(void)
  9. {
  10. int m = 10;
  11. int n = 9;
  12. int ret = 0;
  13. ret = sum(m,n);
  14. printf("ret = %d\n",ret);
  15. return 0;
  16. }
  1. (gdb) bt
  2. #0 sum (m=10, n=9) at sum.c:5
  3. #1 0x08048418 in main () at sum.c:16

每次有函数调用,在栈上就会生成一个栈框(stack frame),也就是一个数据
单元用来描述该函数,描述函数的地址,参数,还有函数的局部变量的值等信息。
使用bt命令就可以把这个栈的调用信息全部显示出来。

由上面的显示结果可以看出,栈上有两个栈框(stack frame),分别用来描述函数

main和函数sum.前面的#0表示sum函数栈框的标号。#1表示main函数栈框的标号。
最新的栈框标号为0.main函数栈框标号最大。

  1. (gdb) frame 1
  2. #1 0x08048418 in main () at sum.c:16
  3. 16 ret = sum(m,n);

frame 1 表示选择栈框1,也就是选择了main函数的栈框,因为我这时候想查看

main函数的信息。

  1. (gdb) info locals
  2. m = 10
  3. n = 9
  4. ret = 0

这时候可以通过info locals查看main函数栈框里面局部变量的值。
-----------------------------------------------------------------------------------
二,使用gdb堆栈跟踪很方面调试递归程序。

  1. #include <stdio.h>
  2. long long func(int n)
  3. {
  4. int i = 0;
  5. if (n > 20) {
  6. printf("n too large!\n");
  7. return -1;
  8. }
  9. if (n == 0)
  10. return 1;
  11. else {
  12. i = n * func(n-1);
  13. return i;
  14. }
  15. }
  16. int main(void)
  17. {
  18. long long ret;
  19. ret = func(10);
  20. printf("ret = %lld\n",ret);
  21. return 0;
  22. }
  1. (gdb) bt
  2. #0 func (n=7) at test.c:7
  3. #1 0x0804843f in func (n=8) at test.c:14
  4. #2 0x0804843f in func (n=9) at test.c:14
  5. #3 0x0804843f in func (n=10) at test.c:14
  6. #4 0x08048469 in main () at test.c:22

如上所示,可以很清楚地看到递归深入到了第几层,以及该层局部变量值的情况。
---------------------------------------------------------------------------------
三,gdb使用手册上有一块专门说如何查看堆栈,翻译后的文档如下:
 gdb查看堆栈.rar

----------------------------------------------------------------------------------
参考: http://www.ibm.com/developerworks/cn/linux/sdk/gdb/index.html 

gdb调试之堆栈跟踪相关推荐

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

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

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

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

  3. GDB调试汇编堆栈过程的学习

    GDB调试汇编堆栈过程的学习 分析过程 这是我的C源文件: 1.安装32位兼容包 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用 ...

  4. gdb调试(如何跟踪指定进程)

    使用gdb调试的时候,gdb只能跟踪一个进程.可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或者是跟踪子进程.默认跟踪父进程. set follow-fork-mode child ...

  5. Linux内核IO追踪:用GDB调试,一个磁盘IO的流程是什么样的

    Table of Contents 构建内核 产生IO写入的程序 追踪到兔子洞 准备步骤 进入FS层:我正在使用的fs是XFS 潜入块层 进入块驱动程序层:我的块驱动程序是SCSI 回到fs层,研究内 ...

  6. coredump gdb 调试_gdb 调试coredump文件过程

    gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到 ...

  7. IntelliJ IDEA 2017.1 EAP与异步堆栈跟踪调试器扩展

    反应性编程趋势后,我们的代码越来越异步. 早些时候java8介绍了CompletableFuture(采用Guava's ListenableFuture),通过Akka, Ratpack, Reac ...

  8. 比较全面的gdb调试命令

    用GDB调试程序  GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序 列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行 软件的优势在于 ...

  9. GDB调试器使用手册

    GDB调试器使用手册     使用GDB:     本文描述GDB,GNU的原代码调试器.(这是4.12版1994年一月,GDB版本4.16) * 目录: * 摘要:                  ...

最新文章

  1. 2021全国大学生智能汽车竞赛中小学组国赛获奖名单
  2. oracle 11gr2 单机数据库使用asm,RHEL7上安装11gR2单机使用ASM存储搭建Physical Standby笔记...
  3. 第一次接触AgilePoint业务流程及任务管理(BPM)
  4. tp5获取所有请求参数、请求头和IP(亲测)
  5. 观点:再见Objective C?程序员眼中的Swift
  6. mac环境下node.js和phonegap/cordova创建ios和android应用
  7. SmartFox中的類型轉換
  8. 理解Java操作数据库原理
  9. python读取word页眉_python 使用win32com实现对word文档批量替换页眉页脚
  10. Edge浏览器无法登录Microsoft账户
  11. html视频自动播放播放器,支持弹字幕HTML5视频播放器DPlayer
  12. 小白Mybatis学习笔记,mybatis入门
  13. HDU 4043 FXTZ II
  14. python绘制热图
  15. 会议记录-Jazes成立!
  16. css3魔方3乘3每层旋转_CSS3旋转魔方
  17. matlab三相短路电流计算程序_三相短路电流计算
  18. 十二小时制和二十四小时制之间的区别
  19. 2021年全球高级计量基础设施(AMI)收入大约3202.8百万美元,预计2028年达到4764.5百万美元
  20. Java中序列化实现原理研究

热门文章

  1. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )
  2. dirty_background_ration 与 /proc/sys/vm/dirty_ratio
  3. 数据库为什么使用B+树而不是B树
  4. sqoop导入数据到hive中元数据问题
  5. CCF 201703-3 Markdown
  6. PHP基本连接数据库
  7. 《C程序设计语言》- 字符输入和输出
  8. 【iOS系列】-程序开启后台运行
  9. 打包静默安装参数(nsis,msi,InstallShield,InnoSetup)[转]
  10. 找出占用磁盘空间最大的前10个文件或文件夹