gdb.execute 阻塞了 python 脚本中的所有线程

gdb.execute blocks all the threads in python scripts

我正在使用 Python 2.7.

编写 GDB 脚本

我只是在使用 gdb.execute("stepi") 步进指令。如果被调试的程序处于空闲状态并等待用户交互,gdb.execute("stepi") 不会 return。如果有这种情况,我想在不终止gdb的情况下停止调试会话。

为此,我创建了一个线程,如果当前指令 运行 超过 x 秒,该线程将终止调试进程:

from ctypes import c_ulonglong, c_bool
from os import kill
from threading import Thread
from time import sleep
import signal

# We need mutable primitives in order to update them in the thread
it = c_ulonglong(0) # Instructions counter
program_exited = c_bool(False)
t = Thread(target=check_for_idle, args=(pid,it,program_exited))
t.start()

while not program_exited.value:
    gdb.execute("si") # Step instruction
    it.value += 1

# Threaded function that will kill the loaded program if it's idling
def check_for_idle(pid, it, program_exited):
    delta_max = 0.1 # Max delay between 2 instructions, seconds
    while not program_exited.value:
        it_prev = c_ulonglong(it.value) # Previous value of instructions counter
        sleep(delta_max)
        # If previous instruction lasted for more than 'delta_max', kill debugged process
        if (it_prev.value == it.value):
            # Process pid has been retrieved before
            kill(pid, signal.SIGTERM)       
            program_exited.value = True
    print("idle_process_end")

但是,gdb.execute 正在暂停我的线程...如果被调试的进程处于空闲状态,是否还有其他方法可以杀死它?

However, gdb.execute is pausing my thread

这里发生的事情是 gdb.execute 在调用 gdb 时没有释放 Python 的全局锁。因此,当 gdb 命令执行时,其他 Python 个线程被卡住了。

这只是 gdb 中的一个疏忽。我已经为它提交了 a bug

Is there another way to kill the debugged process if it is idling?

您可以尝试另一种方法 -- 我不确定它是否有效。不幸的是,gdb 的这一部分还没有完全充实(目前);所以也请随时提交错误报告。

主要思想是 运行 主线程上的 gdb 命令——但不是来自 Python。所以,尝试使用 gdb CLI 编写步进循环,可能像:

(gdb) while 1
> stepi
> end

那你的跟帖应该可以kill了。另一种方法可能是您的线程使用 gdb.post_event.

将 gdb 命令注入主循环