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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb.execute阻止python脚本中的所有线程相关的知识,希望对你有一定的参考价值。

我用Python 2.7编写GDB脚本。

我只是用gdb.execute("stepi")踩指令。如果调试的程序空闲并等待用户交互,则gdb.execute("stepi")不会返回。如果出现这种情况,我想在不终止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正在暂停我的线程...如果它是空闲的话还有另一种方法来杀死调试过程吗?

答案

但是,gdb.execute正在暂停我的线程

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

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

如果它处于空闲状态,是否有另一种方法可以终止已调试的进程?

你可以尝试另外一种技术 - 我不确定它会起作用。不幸的是,这部分gdb并没有完全充实(目前);所以也随意提交错误报告。

主要思想是在主线程上运行gdb命令 - 但不是从Python运行。因此,尝试使用gdb CLI编写步进循环,可能如下:

(gdb) while 1
> stepi
> end

然后你的线程应该能够kill劣质。另一种方法可能是你的线程使用gdb.post_event将gdb命令注入主循环。

以上是关于gdb.execute阻止python脚本中的所有线程的主要内容,如果未能解决你的问题,请参考以下文章

sh 使用iblocklist.com中的阻止列表列表更新传输阻止列表的脚本

Mongoose 阻止节点脚本结束

Mongoose 阻止节点脚本结束

如何阻止 Jupyter Notebook 中的 stderr 输出?

阻止公共访问CodeIgniter中的CRON作业脚本

内容安全策略阻止了我的JQuery脚本中的代码