GDB没有停止"中断"来自python脚本的命令

时间:2017-12-12 21:28:58

标签: python python-2.7 gdb

我已经把头发撕掉了。我在互联网上搜索过,似乎无法找到问题的解决方案。我试图使用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构建中(似乎不太可能)。

3 个答案:

答案 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 秒后安排中断并恢复程序,然后您可以在主脚本中暂停后做任何您想做的事情。