我已经把头发撕掉了。我在互联网上搜索过,似乎无法找到问题的解决方案。我试图使用python中的gdb模块自动测试一些代码。除了停止在后台运行的进程外,我可以执行基本命令并且工作正常。目前我在一个断点之后在后台继续我的程序:
gdb.execute("c&")
然后我与正在运行的程序进行交互,读取不同的常量值并从程序中获取响应 接下来我需要获得一块内存,所以我运行这些命令:
gdb.execute("interrupt") #Pause execution
gdb.execute("dump binary memory montiormem.bin 0x0 (&__etext + 4)") #dump memory to file
但是当我运行内存转储时,我收到一条错误信息,指出命令无法在目标运行时运行,在运行中断命令并暂停目标之后运行,然后从gdb控制台窗口运行我可以运行内存转储。
我在前一段时间发现了一个类似的问题似乎没有被回答here。
我正在使用python2.7。
我还发现这个链接似乎是issue但没有迹象表明它是否在我的gdb构建中(似乎不太可能)。
答案 0 :(得分:0)
我在编写一些自动化测试脚本时遇到了同样的问题。我注意到的是,“ interrupt”命令直到当前脚本退出后才停止应用程序。
不幸的是,这意味着您在导致中断的任何时候都需要对脚本进行分段。
脚本1:
gdb.execute('c&')
gdb.execute('interrupt')
脚本2:
gdb.execute("dump binary memory montiormem.bin 0x0 (&__etext + 4)")
答案 1 :(得分:0)
我使用多线程来解决这个问题:
def post(cmd):
def _callable():
print("exec " + cmd , flush=True)
gdb.execute(cmd)
print("schedule " + cmd , flush=True)
gdb.post_event(_callable)
class ScriptThread (threading.Thread):
def run (self):
while True:
post("echo hello\n")
time.sleep(1)
x = ScriptThread()
x.start()
另存为“test_script.py”
使用脚本如下:
gdb
> source test_script.py
注意:你也可以使用管道“source test_script.py”,但你需要保持管道打开。
一旦线程启动,GDB 将等待线程结束并处理您通过“post_event”函数发送给它的任何命令。甚至“中断”!
答案 2 :(得分:0)
我遇到了同样的问题,从谷歌搜索可以看出这是 gdb 的当前限制:interrupt
在批处理模式下根本不起作用(当使用 --ex
指定命令时,或 { {1}},或在标准输入上,或从文件中获取),它在实际停止执行之前运行以下命令(插入延迟无济于事)。基于@dwjbosman 的解决方案,这里有一个紧凑的版本,适合使用 -x file
参数提供给 gdb,例如:
--ex
它会在 1 秒后安排中断并恢复程序,然后您可以在主脚本中暂停后做任何您想做的事情。