可以定義一個用戶命令合併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)
這裏簡單地按回車鍵重複以前的(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
...等
附:既然你想在每條指令中檢查堆棧,那麼將x/i $pc
添加到sbt
命令也是有意義的,這樣你就知道你要跨過哪條指令。