2015-07-13 111 views
1

不是this question的重複,因爲我正在通過python接口來處理gdb。
This one是類似的,但沒有答案。通過python接口在gdb的斷點處執行命令

我伸出Python中的gdb.breakpoint以便它寫入特定的寄存器到文件,然後跳轉到一個地址:在0x4021ee,我想寫的東西到文件,然後跳轉到0x4021f3

然而,command中的任何內容都不會被執行。

import gdb 
class DebugPrintingBreakpoint(gdb.Breakpoint): 
    def __init__(self, spec, command): 
     super(DebugPrintingBreakpoint, self).__init__(spec, gdb.BP_BREAKPOINT, internal = False) 
     self.command = command 

    def stop(self): 
     with open('tracer', 'a') as f: 
      f.write(chr(gdb.parse_and_eval("$rbx")^0x71)) 
      f.close() 
     return False 



gdb.execute("start") 
DebugPrintingBreakpoint("*0x4021ee", "jump *0x4021f3") 
gdb.execute("continue") 

如果我明確地添加到gdb.execute(self.command)stop()末,我得到Python Exception <class 'gdb.error'> Cannot execute this command while the selected thread is running.:

任何人有命令列出的與蟒蛇GDB斷點工作的例子嗎?

回答

0

一對夫婦選擇嘗試:

  1. 使用gdb.post_event從停止()以後運行所需的命令。我相信你需要從你的函數返回True,然後從你的事件中繼續。
  2. 創建一個正常斷點,並聽取events.stop來檢查您的斷點是否被命中。
0

當以gdb的形式表示劣勢仍在「執行」時,將調用Breakpoint.stop方法。部分原因是這是一種簿記怪異 - 當然,劣勢並不真正執行,當gdb執行一些與斷點相關的處理時,它會停止。在內部,它更像是gdb尚未決定向gdb內的其他相關方報告停止。這個有趣的狀態是什麼讓stop工作很好地相對於next和其他執行命令。

gdb中的一些命令無法在劣勢正在運行時調用,如jump,正如您找到的那樣。

有一件事你可以嘗試 - 我從來沒有嘗試過這個,不知道它是否會工作 - 將被分配到您的stop方法的PC。這可能做正確的事情;但是當然你應該知道文檔警告不要做這樣的怪事。

如果沒有,我認爲唯一的辦法是回退到使用commandsjump附加到斷點。這有缺點,它會干擾next

最後一種方法是修補正在運行的代碼以插入一個跳轉或只是一個序列nop s。