Multithreading 当使用多线程python扩展调试多线程程序时,GDB挂起

Multithreading 当使用多线程python扩展调试多线程程序时,GDB挂起,multithreading,gdb,gdb-python,Multithreading,Gdb,Gdb Python,我正在尝试开发一个GDB python扩展,它定义了一个启动新线程的命令,用户可以在其中检查任意类型的变量。我的python扩展的框架如下: 导入gdb 导入线程 def plot_thread(): 导入时间 尽管如此: 打印('窗口事件循环的占位符') 时间。睡眠(1) 通过 通过 类绘图仪命令(gdb.Command): 定义初始化(自): 超级(PlotterCommand,self)。\uuuu init\uuuuuu(“绘图”, gdb.COMMAND_数据, gdb.完整(符号)

我正在尝试开发一个GDB python扩展,它定义了一个启动新线程的命令,用户可以在其中检查任意类型的变量。我的python扩展的框架如下:

导入gdb
导入线程
def plot_thread():
导入时间
尽管如此:
打印('窗口事件循环的占位符')
时间。睡眠(1)
通过
通过
类绘图仪命令(gdb.Command):
定义初始化(自):
超级(PlotterCommand,self)。\uuuu init\uuuuuu(“绘图”,
gdb.COMMAND_数据,
gdb.完整(符号)
self.不要重复
通过
def调用(self、arg、from_tty):
plot\u thread\u实例=threading.thread(目标=plot\u thread)
plot\u thread\u instance.daemon=True
plot\u thread\u instance.start()
通过
通过
绘图仪命令()
可以看出,我在这里定义了一个plot命令。当我尝试调试以下程序时,如果我:

  • 将断点放在procedure()线程内的任意位置(例如,while循环内的第9行)
  • 在gdb命中断点后运行命令plot
  • 然后继续跑
  • #包括
    #包括
    使用名称空间std;
    无效程序(){
    cout来自:

    GDB使用这个函数(SIGSSUSPEND,GDB挂起的函数)来等待来自应用程序执行的新事件:当调试对象中发生某些事情时(请参阅调试器的工作方式),内核将通过发送SIGCHLD信号来通知GDB。当收到该信号时,GDB将唤醒并检查发生了什么

    然而,信号被传递到GDB进程,但不一定传递到它的主线程。实际上,它经常被传递到第二个线程,而第二个线程并不关心它(这是默认行为),并继续它的生命,就好像什么都没有发生一样

    解决方案是配置线程信号处理行为,以便只有GDB主线程收到这些信号的通知:

    导入gdb
    导入线程
    导入pysigset,signal#导入这些包!
    def plot_thread():
    导入时间
    尽管如此:
    打印('窗口事件循环的占位符')
    时间。睡眠(1)
    通过
    通过
    类绘图仪命令(gdb.Command):
    定义初始化(自):
    超级(PlotterCommand,self)。\uuuu init\uuuuuu(“绘图”,
    gdb.COMMAND_数据,
    gdb.完整(符号)
    self.不要重复
    通过
    def调用(self、arg、from_tty):
    使用pysigset.suspended_信号(signal.SIGCHLD):#在此处禁用信号!
    plot\u thread\u实例=threading.thread(目标=plot\u thread)
    plot\u thread\u instance.daemon=True
    plot\u thread\u instance.start()
    通过
    通过
    通过
    绘图仪命令()
    
    pysigset软件包是必需的,可以从pip(sudo pip install pysigset)安装