2017-05-02 36 views
0

這是參考gdb調試器。通過在頭文件或其他源代碼中放置斷點,而不是正在執行的文件,可以追蹤從main()函數(正在執行的文件)的指令開始的路徑,直到通過在gdb中輸入bt(本質上顯示堆棧),放置斷點(在頭文件或其他源代碼中)。使用gdb在main()中查看每條指令的backtrace('bt')堆棧

是否可以在main()中爲每條指令顯示堆棧,而不必在其他文件中放置斷點,然後按bt?目前,我在各種文件中放置斷點,然後追溯他們的路徑到我感興趣的文件。相反,我想要爲我感興趣的main()函數中的每條指令顯示整個路徑(即「堆棧」)。

回答

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) 

這裏簡單地按回車鍵重複以前的(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命令也是有意義的,這樣你就知道你要跨過哪條指令。