这是参考gdb调试器。通过在头文件或其他源代码中放置断点而不是正在执行的文件,可以从main()函数(正在执行的文件)中的指令开始跟踪路径到通过在gdb中输入 bt (基本上显示堆栈)来放置断点(在头文件或其他源代码中)。
是否可以显示main()中每条指令的堆栈,而不必在其他文件中放置断点,然后按 bt ?目前,我将断点放在各种文件中,然后追溯到我感兴趣的文件的路径。相反,我想要为我感兴趣的main()函数中的每个指令显示整个路径( bt ' stack')。
答案 0 :(得分:0)
您可以定义一个组合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
)命令。
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
命令也是有意义的,这样您就可以知道要切换的指令了什么。