2012-09-05 65 views
2

我正在嘗試從核心文件中使用宏來查找堆棧的開始和結束。爲了達到同樣的目的,我試圖從最後和第一幀中找到esp值。相同的差異會給我使用的堆棧大小。GDB backtrace:查找幀的總數

我們有辦法找到棧中的幀數嗎? bt給我所有的框架。從第0幀我可以找到堆棧的頂部? 我們有辦法找到最後一個幀號嗎?

我們是否有另一種方法來查找堆棧的開始和堆棧的結束? 感謝

回答

5

您可以使用bt -1最外層幀的幀數:

(gdb) bt -1 
#9 0x0000000000464c45 in main (argc=<optimized out>, argv=<optimized out>) 
    at ../../binutils-gdb/gdb/gdb.c:32 

你可以看到最外層框架是#9

但是,編寫腳本有點痛苦。例如,您不能使用frame -1來選擇該幀。

此時您有兩種選擇。

一個選擇是使用gdb Python API遍歷幀並執行任何你喜歡的操作。如果它對您可用,這是最簡單的路線。 Python API被記錄並易於使用;在這種情況下,您將主要對gdb.Frame代碼感興趣。

如果你不能使用Python,你可以使用傳統的,可怕的使用set logging的gdb hack將bt -1的輸出寫入文件;然後shell將此文件的內容重寫爲有效的gdb命令(如frame 9);最後source生成轉換文件。