[英]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。 這可能做對了; 但是您當然應該知道文檔警告您不要做這種奇怪的事情。
未能通過,我認為唯一的方法是退回到使用commands
將jump
附加到斷點的方法。 這樣做的缺點是會干擾next
。
最后一種方法是修補正在運行的代碼,以插入一個跳轉或一系列nop
。
可以嘗試以下幾種選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.