我的软件使用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。然而,我正在寻找更优雅的解决方案,如果存在的话。
答案 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上,以防有人愿意贡献。