GDB堆疊跟蹤的方法

2021-06-19 04:03:52 字數 1080 閱讀 6639

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 打出的堆疊對不上

原因1 需要確保編譯的時候有 g選項,沒有 g是沒符號的 原因2 binary strip過,把符號表刪除了 原因3 binary 跟coredump不匹配 原因4 產生coredump的機器跟debug機器的庫不匹配 一般的輸出為 lib64 so.x is not at the expected...