あなたはとても似stepi
とbt
を組み合わせuserコマンドを定義することができます。ここでは
(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
を追加すると意味がありますので、どの命令をステップオーバーするか分かります。