使用gdb查看main()中每条指令的回溯(';bt';)堆栈

使用gdb查看main()中每条指令的回溯(';bt';)堆栈,gdb,backtrace,Gdb,Backtrace,这是对gdb调试器的参考。通过在头文件或其他源代码(而不是正在执行的文件)中放置断点,可以通过在gdb中输入bt来跟踪从main()函数中的指令(正在执行的文件)开始到断点放置点(在头文件或其他源代码中)的路径(基本上显示堆栈) 是否可以在main()中显示每条指令的堆栈,而不必在其他文件中放置断点,然后按bt?目前,我正在各种文件中放置断点,然后跟踪它们到我感兴趣的文件的路径。相反,我想要整个路径(bt“堆栈”)要为我感兴趣的main()函数中的每个指令显示。您可以定义一个结合stepi和bt

这是对gdb调试器的参考。通过在头文件或其他源代码(而不是正在执行的文件)中放置断点,可以通过在gdb中输入bt来跟踪从main()函数中的指令(正在执行的文件)开始到断点放置点(在头文件或其他源代码中)的路径(基本上显示堆栈)


是否可以在main()中显示每条指令的堆栈,而不必在其他文件中放置断点,然后按bt?目前,我正在各种文件中放置断点,然后跟踪它们到我感兴趣的文件的路径。相反,我想要整个路径(bt“堆栈”)要为我感兴趣的main()函数中的每个指令显示。

您可以定义一个结合
stepi
bt
的用户命令,如下所示:

(gdb) define sbt
Type commands for definition of "sbt".
End with a line saying just "end".
>stepi
>bt
>end
以下是示例用法:

$ cat t.c
int bar() { return 42; }
int foo() { return bar(); }
int main() { return foo(); }

$ gcc -g t.c
$ gdb -q ./a.out
如上所述定义
sbt
命令。现在使用它:

(gdb) start
Temporary breakpoint 1 at 0x40050c: file t.c, line 3.
Starting program: /tmp/a.out 

Temporary breakpoint 1, main () at t.c:3
3       int main() { return foo(); }
(gdb) sbt
0x0000000000400511      3       int main() { return foo(); }
#0  0x0000000000400511 in main () at t.c:3
(gdb)
这里只需按Enter键即可重复上一个(
sbt
)命令

……等等

另外,由于您希望在每条指令上检查堆栈,因此也可以将
x/i$pc
添加到
sbt
命令中,这样您就可以知道要跳过的指令

foo () at t.c:2
2       int foo() { return bar(); }
#0  foo () at t.c:2
#1  0x0000000000400516 in main () at t.c:3
(gdb) 
0x00000000004004f9      2       int foo() { return bar(); }
#0  0x00000000004004f9 in foo () at t.c:2
#1  0x0000000000400516 in main () at t.c:3
(gdb) 
2       int foo() { return bar(); }
#0  foo () at t.c:2
#1  0x0000000000400516 in main () at t.c:3
(gdb) 
0x0000000000400501      2       int foo() { return bar(); }
#0  0x0000000000400501 in foo () at t.c:2
#1  0x0000000000400516 in main () at t.c:3
(gdb) 
bar () at t.c:1
1       int bar() { return 42; }
#0  bar () at t.c:1
#1  0x0000000000400506 in foo () at t.c:2
#2  0x0000000000400516 in main () at t.c:3