2016-03-10 15 views
1

當我輸入list mystruct到gdb中時,我收到用於定義mystruct的代碼行。我如何讓gdb給我正在閱讀的文件來打印這些行?從gdb python接口獲取該文件將是可取的。越容易分析越好。如何查找使用gdb定義的文件?

謝謝!

回答

1

對於示出的類型的定義有一個命令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就是一個例子。

+0

第二個命令看起來像我正在尋找;然而,當我嘗試在我的最後,它只是給出: 「所有類型匹配正則表達式」「^ mystruct $」「:」 正則表達式似乎不匹配。 – Matt

+0

沒關係,我意識到刪除了「^ mystruct $」工作的引號。你的迴應列出了文件名和行號,但gdb只給了我文件名。有什麼額外的事情來讓它打印出行號? – Matt

+0

@Matt檢查我的更新,我用gcc/gdb玩過,並且無法看到行號,即使它們存儲在文件中的矮人中,也需要深入研究gdb源碼爲什麼會這樣...但是既然你提到了python, pyelftools是你去的路... – pmod