GDB再学习(5.3):常用指令介绍_backtrace_查看函数栈



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) 

猜你喜欢

转载自blog.csdn.net/u011003120/article/details/109815696