在LLDB初始化时禁用信号

时间:2013-06-07 17:41:16

标签: lldb

我的软件使用SIGUSR2信号,我使用LLDB(在Xcode 4.6.2下)作为我的调试器。我想禁止LLDB停止在SIGUSR2,并且已经使用以下命令禁用LLDB:

process handle --pass true --stop false --notify true SIGUSR2

我正在寻找让LLDB在启动时始终执行此命令的方法。我已经考虑在我的.lldbinit中添加settings append target.process.extra-startup-command process行中的内容,但是这会更改target.process.extra-startup-command设置的值(由settings show命令证明) ,我不确定是否/如何使用此设置始终执行process handle命令来禁用SIGUSR2信号。

我知道这里发布的“解决方案”:Permanently configuring LLDB (in Xcode 4.3.2) not to stop on signals。然而,我正在寻找更优雅的解决方案,如果存在的话。

2 个答案:

答案 0 :(得分:4)

目前,在main的断点命令中执行此操作的建议是最优雅的解决方案。

gdb拥有这个全世界的视图,无论他们使用什么系统,所有进程都会对UNIX信号做出神奇的回应。因此,在进程获得SIGINT之前说出会发生什么事情是有道理的。在lldb中,该过程在创建时将告诉我们它的信号是什么以及它们的默认行为。这很可爱,除了它意味着现在没有自然的地方存储信号行为的配置选项,然后才能进行处理。这只是必须添加的东西。

触发“流程生命周期事件”的能力,不仅仅是“流程启动”,而是“流程退出”和“共享库负载”等,这将是一个很好的补充。提交增强请求(http://bugreport.apple.com/)会很好,因为这样的错误可以作为功能的投票。

BTW,target.process.extra-startup-command做了一些完全不同的事情。它允许您在我们开始运行之前将一些命令添加到lldb发送到其调试代理(例如debugserver)的序列中。它的主要用途是打开更多的debugserver日志记录。

答案 1 :(得分:0)

由于我定期返回此问题以进行配置,所以最终我最终创建了一个小脚本来自动执行此操作:

import lldb
import threading

class ProcessEventListener(threading.Thread):
    def __init__(self, debugger):
        super(ProcessEventListener, self).__init__()
        self._listener = debugger.GetListener()
        self._debugger = debugger
        self._interpreter = debugger.GetCommandInterpreter()
        self._handled = set()

    def _suppress_signals(self, process):
        signals = process.GetUnixSignals()
        signals.SetShouldStop(11, False)

    def run(self):
        while True:
            event = lldb.SBEvent()
            if not self._listener.PeekAtNextEvent(event):
                continue                
            process = self._interpreter.GetProcess()
            if process and not process.GetUniqueID() in self._handled:
                self._suppress_signals(process)
                self._handled.add(process.GetUniqueID())

def __lldb_init_module(debugger, *rest):
    listener_thread = ProcessEventListener(debugger)
    listener_thread.start()

要使用,请将其放在类似ignore_signals.py的地方,并从.lldbinit进行引用:

command script import ~/ignore_signals.py

我怀疑这可以进一步改善,因此我也将其放在GitHub上,以防有人愿意贡献。