gdb调试之堆栈跟踪
在使用gdb调试时,经常要用到查看堆栈信息,特别是在内核调试时,这
---------------------------------------------------------------------------------
一,简单实例。
- #include <stdio.h>
- int sum(int m,int n)
- {
- int i = 3;
- int j = 4;
- return m+n;
- }
- int main(void)
- {
- int m = 10;
- int n = 9;
- int ret = 0;
- ret = sum(m,n);
- printf("ret = %d\n",ret);
- return 0;
- }
- (gdb) bt
- #0 sum (m=10, n=9) at sum.c:5
- #1 0x08048418 in main () at sum.c:16
每次有函数调用,在栈上就会生成一个栈框(stack frame),也就是一个数据
单元用来描述该函数,描述函数的地址,参数,还有函数的局部变量的值等信息。
使用bt命令就可以把这个栈的调用信息全部显示出来。
由上面的显示结果可以看出,栈上有两个栈框(stack frame),分别用来描述函数
- (gdb) frame 1
- #1 0x08048418 in main () at sum.c:16
- 16 ret = sum(m,n);
frame 1 表示选择栈框1,也就是选择了main函数的栈框,因为我这时候想查看
- (gdb) info locals
- m = 10
- n = 9
- ret = 0
这时候可以通过info locals查看main函数栈框里面局部变量的值。
-----------------------------------------------------------------------------------
二,使用gdb堆栈跟踪很方面调试递归程序。
- #include <stdio.h>
- long long func(int n)
- {
- int i = 0;
- if (n > 20) {
- printf("n too large!\n");
- return -1;
- }
- if (n == 0)
- return 1;
- else {
- i = n * func(n-1);
- return i;
- }
- }
- int main(void)
- {
- long long ret;
- ret = func(10);
- printf("ret = %lld\n",ret);
- return 0;
- }
- (gdb) bt
- #0 func (n=7) at test.c:7
- #1 0x0804843f in func (n=8) at test.c:14
- #2 0x0804843f in func (n=9) at test.c:14
- #3 0x0804843f in func (n=10) at test.c:14
- #4 0x08048469 in main () at test.c:22
如上所示,可以很清楚地看到递归深入到了第几层,以及该层局部变量值的情况。
---------------------------------------------------------------------------------
三,gdb使用手册上有一块专门说如何查看堆栈,翻译后的文档如下:
gdb查看堆栈.rar
gdb调试之堆栈跟踪相关推荐
- 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 .c代码文件 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const stat ...
- GDB调试汇编堆栈过程的学习
GDB调试汇编堆栈过程的学习 分析过程 这是我的C源文件: 1.安装32位兼容包 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用 ...
- gdb调试(如何跟踪指定进程)
使用gdb调试的时候,gdb只能跟踪一个进程.可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或者是跟踪子进程.默认跟踪父进程. set follow-fork-mode child ...
- Linux内核IO追踪:用GDB调试,一个磁盘IO的流程是什么样的
Table of Contents 构建内核 产生IO写入的程序 追踪到兔子洞 准备步骤 进入FS层:我正在使用的fs是XFS 潜入块层 进入块驱动程序层:我的块驱动程序是SCSI 回到fs层,研究内 ...
- coredump gdb 调试_gdb 调试coredump文件过程
gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep 进程名称 找到 ...
- IntelliJ IDEA 2017.1 EAP与异步堆栈跟踪调试器扩展
反应性编程趋势后,我们的代码越来越异步. 早些时候java8介绍了CompletableFuture(采用Guava's ListenableFuture),通过Akka, Ratpack, Reac ...
- 比较全面的gdb调试命令
用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序 列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行 软件的优势在于 ...
- GDB调试器使用手册
GDB调试器使用手册 使用GDB: 本文描述GDB,GNU的原代码调试器.(这是4.12版1994年一月,GDB版本4.16) * 目录: * 摘要: ...
最新文章
- 2021全国大学生智能汽车竞赛中小学组国赛获奖名单
- oracle 11gr2 单机数据库使用asm,RHEL7上安装11gR2单机使用ASM存储搭建Physical Standby笔记...
- 第一次接触AgilePoint业务流程及任务管理(BPM)
- tp5获取所有请求参数、请求头和IP(亲测)
- 观点:再见Objective C?程序员眼中的Swift
- mac环境下node.js和phonegap/cordova创建ios和android应用
- SmartFox中的類型轉換
- 理解Java操作数据库原理
- python读取word页眉_python 使用win32com实现对word文档批量替换页眉页脚
- Edge浏览器无法登录Microsoft账户
- html视频自动播放播放器,支持弹字幕HTML5视频播放器DPlayer
- 小白Mybatis学习笔记,mybatis入门
- HDU 4043 FXTZ II
- python绘制热图
- 会议记录-Jazes成立!
- css3魔方3乘3每层旋转_CSS3旋转魔方
- matlab三相短路电流计算程序_三相短路电流计算
- 十二小时制和二十四小时制之间的区别
- 2021年全球高级计量基础设施(AMI)收入大约3202.8百万美元,预计2028年达到4764.5百万美元
- Java中序列化实现原理研究
热门文章
- 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )
- dirty_background_ration 与 /proc/sys/vm/dirty_ratio
- 数据库为什么使用B+树而不是B树
- sqoop导入数据到hive中元数据问题
- CCF 201703-3 Markdown
- PHP基本连接数据库
- 《C程序设计语言》- 字符输入和输出
- 【iOS系列】-程序开启后台运行
- 打包静默安装参数(nsis,msi,InstallShield,InnoSetup)[转]
- 找出占用磁盘空间最大的前10个文件或文件夹