2
我正在嘗試從核心文件中使用宏來查找堆棧的開始和結束。爲了達到同樣的目的,我試圖從最後和第一幀中找到esp值。相同的差異會給我使用的堆棧大小。GDB backtrace:查找幀的總數
我們有辦法找到棧中的幀數嗎? bt給我所有的框架。從第0幀我可以找到堆棧的頂部? 我們有辦法找到最後一個幀號嗎?
我們是否有另一種方法來查找堆棧的開始和堆棧的結束? 感謝
我正在嘗試從核心文件中使用宏來查找堆棧的開始和結束。爲了達到同樣的目的,我試圖從最後和第一幀中找到esp值。相同的差異會給我使用的堆棧大小。GDB backtrace:查找幀的總數
我們有辦法找到棧中的幀數嗎? bt給我所有的框架。從第0幀我可以找到堆棧的頂部? 我們有辦法找到最後一個幀號嗎?
我們是否有另一種方法來查找堆棧的開始和堆棧的結束? 感謝
您可以使用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
生成轉換文件。