gdb跟踪堆栈
2013-08-01 18:12
288 查看
在使用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),分别用来描述函数main和函数sum.前面的#0表示sum函数栈框的标号。#1表示main函数栈框的标号。最新的栈框标号为0.main函数栈框标号最大。
(gdb) frame 1
#1 0x08048418 in main () at sum.c:16
16 ret = sum(m,n);
frame 1 表示选择栈框1,也就是选择了main函数的栈框,因为我这时候想查看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的堆栈跟踪,可以看到所有已调用的函数列表,以及每个函数在栈中的信息。
---------------------------------------------------------------------------------
一,简单实例。
#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),分别用来描述函数main和函数sum.前面的#0表示sum函数栈框的标号。#1表示main函数栈框的标号。最新的栈框标号为0.main函数栈框标号最大。
(gdb) frame 1
#1 0x08048418 in main () at sum.c:16
16 ret = sum(m,n);
frame 1 表示选择栈框1,也就是选择了main函数的栈框,因为我这时候想查看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堆栈跟踪的方法
- Linux下gdb调试程序之堆栈跟踪
- GDB堆栈跟踪与汇编调试
- 编程工具系列之 ------使用GDB的堆栈跟踪功能
- gdb调试之堆栈跟踪
- gdb的使用(二) 堆栈跟踪、core文件、连接到其它进程
- gdb调试之堆栈跟踪
- 编程工具系列之一------使用GDB的堆栈跟踪功能
- 20145218 GDB调试汇编堆栈过程分析
- 20145240 GDB调试汇编堆栈过程分析
- 20145222GDB调试汇编堆栈过程分析
- gdb使用指南:单步执行和跟踪函数调用
- 每天进步一点点——Linux系统中的异常堆栈跟踪简单实现
- Linux内核分析之三——使用gdb跟踪调试内核从start_kernel到init进程启动
- linux内核分析学习笔记:用gdb跟踪linux内核启动过程
- 用GDB跟踪观察共享库函数的地址翻译过程
- gdb——单步执行和跟踪函数
- gdb查看线程堆栈信息
- GDB 的常用命令 -- 用gdb 跟踪、调试 chromium webkit_unit_tests