當我輸入list mystruct
到gdb中時,我收到用於定義mystruct的代碼行。我如何讓gdb給我正在閱讀的文件來打印這些行?從gdb python接口獲取該文件將是可取的。越容易分析越好。如何查找使用gdb定義的文件?
謝謝!
當我輸入list mystruct
到gdb中時,我收到用於定義mystruct的代碼行。我如何讓gdb給我正在閱讀的文件來打印這些行?從gdb python接口獲取該文件將是可取的。越容易分析越好。如何查找使用gdb定義的文件?
謝謝!
對於示出的類型的定義有一個命令p-型:
$ ptype mystruct
...
要知道類型定義,命令信息類型正則表達式:
$ info types ^mystruct$
<filename>:<line>
並以打印源文件行,命令列表文件名:start_line,文件名:end_line:
$ list myfile.c:100,myfile.c:110
如果沒有足夠的
$ list +
注意,有可能幾個同類型difinitions,所以信息類型可以給幾個地點。
更新
由於這是編譯器之間的兼容性的問題(即生成調試信息,如矮)和GDB讀取它,因爲某些原因,它並不總是可以檢索的詳細信息,例如電話號碼。這可以通過使用特定的工具來解決,例如,對於DWARF,有一個dwarfdump工具,該工具可以訪問文件中的所有DWARF信息。對於結構型
struct mystruct {
int i;
struct sample *less;
}
輸出看起來像:
$ dwarfdump -ie ./a.out
...
< 1><0x00000079> structure_type
name "mystruct"
byte_size 0x0000000c
decl_file 0x00000002 ../sample.h
decl_line 0x00000003
sibling <0x000000a8>
< 2><0x00000085> member
name "i"
decl_file 0x00000002 ../sample.h
decl_line 0x00000004
type <0x0000004f>
data_member_location 0
< 2><0x0000008f> member
name "less"
decl_file 0x00000002 ../sample.h
decl_line 0x00000005
type <0x000000a8>
data_member_location 4
在這裏,你必須爲每個成員上線,不僅類型聲明開始的信息,還行號。
輸出格式不是很方便,而且很重 - 您應該編寫自己的解析器。但是使用libdwarf編寫自己的工具或者在python上使用pyelftools可能會更好。 Here就是一個例子。
第二個命令看起來像我正在尋找;然而,當我嘗試在我的最後,它只是給出: 「所有類型匹配正則表達式」「^ mystruct $」「:」 正則表達式似乎不匹配。 – Matt
沒關係,我意識到刪除了「^ mystruct $」工作的引號。你的迴應列出了文件名和行號,但gdb只給了我文件名。有什麼額外的事情來讓它打印出行號? – Matt
@Matt檢查我的更新,我用gcc/gdb玩過,並且無法看到行號,即使它們存儲在文件中的矮人中,也需要深入研究gdb源碼爲什麼會這樣...但是既然你提到了python, pyelftools是你去的路... – pmod