1 指令说明
backtrace(简写bt)可以查看程序的调用栈。每帧显示一行,如果有多个帧,它会以当前的帧为第0帧,然后再到调用它的帧为第1帧,依次类推。
如下,main调用test2函数,当前帧(第0帧)为test2函数。
(gdb) bt
#0 0x0000000000400576 in test2 () at test_gdb.c:12
#1 0x00000000004005e5 in main () at test_gdb.c:28
2 代码准备
使用如下代码进行测试
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
int j = 0;
int test2()
{
char* s8Buf = NULL;
strcpy(s8Buf, "8888");
return 0;
}
int main()
{
int i = 0;
for (i = 0; i < 60; i++)
{
j++;
printf("-------->index %d\n", i);
sleep(1);
}
test2();
return 0;
}
3 指令测试
bt指令如下:
bt [option]... [qualifier]... [count]
其中,[count]代表打印多少栈帧,用法如下。
3.1 打印最里面的N帧 bt n
使用此指令可以打印最里面的n帧。
(gdb) bt
#0 0x0000000000400576 in test2 () at test_gdb.c:12
#1 0x00000000004005e5 in main () at test_gdb.c:28
(gdb) bt 1
#0 0x0000000000400576 in test2 () at test_gdb.c:12
(More stack frames follow...)
(gdb)
3.2 打印最外面的N帧 bt -n
使用此指令可以打印最里面的n帧。
(gdb) bt
#0 0x0000000000400576 in test2 () at test_gdb.c:12
#1 0x00000000004005e5 in main () at test_gdb.c:28
(gdb) bt -1
#1 0x00000000004005e5 in main () at test_gdb.c:28
3.3 打印栈帧并打印局部变量的值 bt full
使用此指令可以打印局部变量的值,可以获得更详细的信息。
当然,也可以和3.1 3.2中的配合使用,打印n帧信息。
(gdb) bt
#0 0x0000000000400576 in test2 () at test_gdb.c:12
#1 0x00000000004005e5 in main () at test_gdb.c:28
(gdb) bt full
#0 0x0000000000400576 in test2 () at test_gdb.c:12
s8Buf = 0x0
#1 0x00000000004005e5 in main () at test_gdb.c:28
i = 60
(gdb)