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

时间:2017-05-02 19:17:39

标签: gdb backtrace

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

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

1 个答案:

答案 0 :(得分:0)

您可以定义一个组合stepibt的用户命令,如下所示:

(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)命令。

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

......等等。

P.S。由于您希望在每条指令中检查堆栈,因此将x/i $pc添加到sbt命令也是有意义的,这样您就可以知道要切换的指令了什么。