GDB在使用python脚本的 "中断 "命令时没有停止工作

0 人关注

我一直在为这个问题撕扯我的头发。 我在网上搜索了一下,似乎没有找到解决问题的办法。 我试图用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 .

I'm using python2.7.

我还发现了这个链接,它似乎是 issue 但没有迹象表明它是否在我的gdb构建中(这似乎不太可能)。

python
python-2.7
gdb
Corey
Corey
发布于 2017-12-13
4 个回答
Chris Moore
Chris Moore
发布于 2021-06-16
已采纳
0 人赞同

我也遇到了同样的问题,但发现如果你想从python中编写所有的脚本,这里的其他答案都不起作用。 我遇到的问题是,当我调用 gdb.execute('continue') 时,其他任何python线程的代码都不会执行。 这似乎是由于 gdb不释放python的GIL 当continue命令在等待程序被中断时。

我发现真正对我有用的是这个。

def delayed_interrupt():
    time.sleep(1)
    gdb.execute('interrupt')
gdb.post_event(delayed_interrupt)
gdb.execute('continue')
    
Neb Gast
Neb Gast
发布于 2021-06-16
0 人赞同

我在编写一些自动测试脚本时也碰到了这个问题。我注意到的是,'中断'命令在当前脚本退出后才会停止应用程序。

不幸的是,这意味着你需要在造成中断的任何时候对你的脚本进行分段。

Script 1:

gdb.execute('c&')
gdb.execute('interrupt')

Script 2:

gdb.execute("dump binary memory montiormem.bin 0x0 (&__etext + 4)")
    
dwjbosman
dwjbosman
发布于 2021-06-16
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"

使用脚本如下。

> source test_script.py

注意:你也可以用管道输送 "source test_script.py",但你需要保持管道畅通。

一旦线程被启动,GDB将等待线程结束,并处理你通过 "post_event "函数发给它的任何命令。甚至是 "中断"!

John Smith
John Smith
发布于 2021-06-16
0 人赞同

我也有同样的问题,从我在谷歌上搜索到的信息来看,这是目前gdb的一个限制。替换代码0】在批处理模式下根本不起作用(当用 --ex -x file 指定命令时,或在stdin上,或从文件中获取),它在实际停止执行之前运行下面的命令(插入一个延迟并没有帮助)。在@dwjbosman的解决方案的基础上,这里有一个紧凑的版本,适合用 --ex 的参数反馈给gdb,例如。

python import threading, gdb