在使用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
单元用来描述该函数,描述函数的地址,参数,还有函数的局部变量的值等信息。
使用bt命令就可以把这个栈的调用信息全部显示出来。
由上面的显示结果可以看出,栈上有两个栈框(stack frame),分别用来描述函数
(gdb) frame 1
#1 0x08048418 in main () at sum.c:16
16 ret = sum(m,n);
(gdb) info locals
m = 10
n = 9
ret = 0
-----------------------------------------------------------------------------------
二,使用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