2017-05-02 9 views
0

これはgdbデバッガーを参照しています。実行中のファイルではなく、ヘッダファイルや別のソースコードにブレークポイントを配置することにより、(実行中のファイルの)main()関数内の命令から、ブレークポイントは、ヘッダーファイルまたは別のソースコードに配置され、bt(gdbに基本的に表示されます)と入力します。gdbを使用してmain()の各命令のバックトレース( 'bt')スタックを表示

ブレークポイントを他のファイルに配置しなくても、btを押すことなく、main()のすべての命令のスタックを表示できますか?現時点では、私は様々なファイルにブレークポイントを配置して、自分の興味のあるファイルにパスをトレースしています。代わりに、自分の興味のあるmain()関数内のすべての命令に対して、全体のパス(bt 'スタック')を表示したいと思います。

答えて

0

あなたはとても似stepibtを組み合わせ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を追加すると意味がありますので、どの命令をステップオーバーするか分かります。

関連する問題