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