簡體   English   中英

通過python接口在gdb中的斷點處執行命令

[英]Executing commands at breakpoint in gdb via python interface

這個問題不是重復的,因為我正在通過gdb的python接口進行工作。
是相似的但沒有答案。

我正在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()的末尾, gdb.execute(self.command)得到Python Exception <class 'gdb.error'> Cannot execute this command while the selected thread is running.:

有人在python gdb中帶有斷點的命令列表的工作示例嗎?

用gdb術語,當劣等項仍在“執行”時,將調用Breakpoint.stop方法。 在某種程度上,這是一個記賬的怪癖-當然,劣等代碼並沒有真正執行,它會在gdb進行一些與斷點相關的處理時停止。 在內部,這更像是gdb尚未決定將停止報告給gdb內部的其他相關方。 這個有趣的狀態使stop工作相對於next和其他執行命令如此出色。

如您所見,在劣等程序運行時無法調用gdb中的某些命令,例如jump

您可以嘗試的一件事-我從未嘗試過並且不知道它是否會工作-可以通過stop方法將其分配給PC。 這可能做對了; 但是您當然應該知道文檔警告您不要做這種奇怪的事情。

未能通過,我認為唯一的方法是退回到使用commandsjump附加到斷點的方法。 這樣做的缺點是會干擾next

最后一種方法是修補正在運行的代碼,以插入一個跳轉或一系列nop

可以嘗試以下幾種選擇:

  1. 使用stop()中的gdb.post_event在以后運行所需的命令。 我相信您需要從函數中返回True,然后從事件中調用Continue。
  2. 創建一個正常的斷點並聽events.stop檢查您的斷點是否被擊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM