在gdb中使用python脚本发送信号后继续

在gdb中使用python脚本发送信号后继续,python,gdb,Python,Gdb,我试图用gdb中的python脚本生成一些关于分段错误(和其他信号)的输出。脚本如下所示: import gdb def event_handler(event): gdb.execute("set scheduler-locking on") # this is needed to avoid parallel exec of the handler gdb.write("\n[ME] SIG " + event.stop_signal) frame = gdb.s

我试图用gdb中的python脚本生成一些关于分段错误(和其他信号)的输出。脚本如下所示:

import gdb

def event_handler(event):
    gdb.execute("set scheduler-locking on") # this is needed to avoid parallel exec of the handler

    gdb.write("\n[ME] SIG " + event.stop_signal)
    frame = gdb.selected_frame()
    while frame:
        gdb.write("\n[ME] FN " + str(frame.name()))
        frame = frame.older()

# make sure output goes to a file
gdb.execute("set logging on") 
gdb.execute("set logging file gdbout")
gdb.events.stop.connect(event_handler)
问题是我需要按c键并输入每个分段错误,脚本不会继续

如果我这样做

gdb.execute("continue")
在处理器中,我得到一个堆栈溢出。我认为这是因为execute()永远不会返回。如果我这样做

handle SIGSEGV nostop

我的处理程序不再被调用。处理程序之后如何继续?

不幸的是,gdb中的信号仍然没有一个好的Python API。相反,你必须求助于黑客。也就是说,我觉得你的方法很好


为了解决“continue”问题,我建议使用
gdb.post_event
将事件插入gdb的事件队列。该事件可以调用
continue
命令。这至少可以避免堆栈溢出问题。

好的,我找到了解决方法:

首先,我需要一个continue命令的callable。根据Tom的建议,这将用于赛后活动:

class Executor:
    def __init__(self, cmd):
        self.__cmd = cmd

    def __call__(self):
        gdb.execute(self.__cmd)
下面是事件处理程序:

def event_handler(event):
    gdb.execute("set scheduler-locking on") # to avoid parallel signals in other threads

    gdb.write("\n[ME] SIG " + event.stop_signal)
    frame = gdb.selected_frame()
    while frame:
        gdb.write("\n[ME] FN " + str(frame.name()))
        frame = frame.older()
    gdb.execute("set scheduler-locking off") # otherwise just this thread is continued, leading to a deadlock   
    gdb.post_event(Executor("continue")) # and post the continue command to gdb
然后,调用它:

gdb.execute("set logging on")
gdb.execute("set logging file gdbout")
gdb.execute("set pagination off")
gdb.events.stop.connect(event_handler)

诀窍是稍后禁用调度程序锁定,这是避免并发问题所必需的,但如果没有处理程序正在运行,则会导致死锁

不幸的是,整个调试器都被这个解决方案卡住了。