2015-04-03 76 views
1

我有一個很大的源代碼樹,其目錄中有幾個文件。每次調用任何這些函數時,我都希望gdb中斷,但不想指定每個文件。我試過設置break /path/to/dir/:*,break /path/to/dir/*:*,rbreak /path/to/dir/.*:*但是他們都沒有捕獲該目錄中的任何功能。我怎樣才能讓gdb做我想做的事?gdb可以在目錄中的每個函數中設置中斷嗎?

+0

相關:[使用gdb停止程序,當它使用從文件X中的任何功能](http://stackoverflow.com/questions/475283/using-gdb-stop-the-program-when-it-is-使用-任何功能-從文件-X)。 – 2015-04-12 16:22:32

回答

0

您可以使用現代gdb附帶的Python腳本執行此操作。有兩種選擇:一種是列出所有符號,然後如果它們包含所需的目錄,則在合適的位置創建斷點類的實例以設置斷點。 (對不起,我不記得如何得到所有符號的列表,但我認爲你可以這樣做。)

你沒有說過爲什麼你需要這樣做,但取決於你的用例替代方案可能是使用可逆調試 - 即讓它崩潰,然後退後一步。您可以使用gdb的內置可逆調試,或從根本上提高了性能,見UndoDB(http://undo-software.com/

+0

我找不到如何列出GDB的Python API中的所有符號,並且Tromey表明它不可能:http://stackoverflow.com/a/30032690/895245我會在回答/配置文件中提到您與其共同創建的撤消。我不懷疑它更有效率。 :-) – 2015-07-17 20:12:48

1

似乎沒有直接的辦法做到這一點:

我已經找到了最好的解決方法是遍歷使用Python API的文件,然後調用rbreak與這些文件:

import os 

class RbreakDir(gdb.Command): 
    def __init__(self): 
     super().__init__(
      'rbreak-dir', 
      gdb.COMMAND_BREAKPOINTS, 
      gdb.COMPLETE_NONE, 
      False 
     ) 
    def invoke(self, arg, from_tty): 
     for root, dirs, files in os.walk(arg): 
      for basename in files: 
       path = os.path.abspath(os.path.join(root, basename)) 
       gdb.execute('rbreak {}:.'.format(path), to_string=True) 
RbreakDir() 

使用範例:

source a.py 
rbreak-dir directory 

由於gdb.execute調用,這很醜,但似乎工作。

但是,如果你有很多目錄下的文件太慢了。

我的測試代碼是my GitHub repo

相關問題