GDB堆疊跟蹤

2021-08-05 23:53:46 字數 1080 閱讀 5332

gdb堆疊跟蹤的方法

程式「呼叫堆疊」是當前函式之前的所有已呼叫函式的列表(包括當前函式)。每個函式及其變數都被分配了乙個「幀」,最近呼叫的函式在 0 號幀中(「底部」幀)。要列印堆疊,發出命令 'bt'('backtrace' [回溯] 的縮寫):

(gdb) bt

#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7

#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21

此結果顯示了在 main() 的第 21 行中呼叫了函式 wib()(只要使用 'list 21' 就能證實這一點),而且 wib() 在 0 號幀中,main() 在 1 號幀中。由於 wib() 在 0 號幀中,那麼它就是執行程式時發生算術錯誤的函式。

實際上,發出 'info locals' 命令時,gdb 會列印出當前幀中的區域性變數,預設情況下,這個幀中的函式就是被中斷的函式(0 號幀)。可以使用命令 'frame' 列印當前幀。要檢視 main 函式(在 1 號幀中)中的變數,可以發出 'frame 1' 切換到 1 號幀,然後發出 'info locals' 命令:

(gdb) frame 1

#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21

21          result = wib(value, div);

(gdb) info locals

value = 8

div = 8

result = 4

i = 2

total = 6

此資訊顯示了在第三次執行 "for" 迴圈時(i 等於 2)發生了錯誤,此時 "value" 等於 "div"。

可以通過如上所示在 'frame' 命令中明確指定號碼,或者使用 'up' 命令在堆疊中上移以及 'down' 命令在堆疊中下移來切換幀。要獲取有關幀的進一步資訊,如它的位址和程式語言,可以使用命令 'info frame'。

gdb 堆疊命令可以在程式執行期間使用,也可以在 core 檔案中使用,因此對於複雜的程式,可以在程式執行時跟蹤它是如何轉到函式的。

GDB堆疊跟蹤的方法

gdb堆疊跟蹤的方法 程式 呼叫堆疊 是當前函式之前的所有已呼叫函式的列表 包括當前函式 每個函式及其變數都被分配了乙個 幀 最近呼叫的函式在 0 號幀中 底部 幀 要列印堆疊,發出命令 bt backtrace 回溯 的縮寫 gdb bt 0 0x80483ea in wib no1 8,no2 ...

gdb 跟蹤除錯

要進行除錯程式首先要生成乙個含有除錯資訊的執行程式命令如下 此時便會生成乙個含有除錯資訊的可執行檔案,然後便可以用 gdb 去除錯這個程式了,進入除錯程式命令,但是如果用 gdb 去除錯乙個未包含除錯資訊的可執行檔案則會發生錯誤 執行 gdb gdb 啟動常用的引數 從指定檔案中讀取符號表資訊,並把...

gdb 跟蹤除錯命令整理

內容源自於陳浩csdn部落格的用gdb除錯程式一系列文章 要進行除錯程式首先要生成乙個含有除錯資訊的執行程式命令如下 此時便會生成乙個含有除錯資訊的可執行檔案,然後便可以用 gdb 去除錯這個程式了,進入除錯程式命令,但是如果用 gdb 去除錯乙個未包含除錯資訊的可執行檔案則會發生錯誤 執行 gdb...