我的软件使用SIGUSR2信号,我使用LLDB(在Xcode 4.6.2下)作为我的调试器.我想禁止LLDB在SIGUSR2停止并且使用以下命令执行此操作:
process handle --pass true --stop false --notify true SIGUSR2
Run Code Online (Sandbox Code Playgroud)
我正在寻找让LLDB始终在启动时执行此命令的方法.我已经考虑settings append target.process.extra-startup-command process在我的.lldbinit中添加一些内容,但是这会改变target.process.extra-startup-command设置的值(由settings show命令证明),我不确定是否/如何使用此设置始终执行process handle命令以禁用SIGUSR2信号.
我知道这里发布的"解决方案":永久配置LLDB(在Xcode 4.3.2中)不要停止信号.然而,我正在寻找更优雅的解决方案,如果存在的话.
目前,建议在断点命令上执行此操作main是可用的最简洁的解决方案。
gdb拥有这样一个世界观:所有进程,无论它们位于什么系统上,都可以神奇地响应UNIX信号。因此,有道理地说,当您有了进程之前,当进程获得SIGINT时将发生什么。在lldb中,该过程在创建时将告诉我们其信号是什么以及它们的默认行为。这很可爱,除了这意味着现在没有自然的地方可以在您进行处理之前存储信号行为的配置选项。这只是必须添加的内容。
触发“流程生命周期事件”(不仅是“流程启动”,而且还有“流程退出”和“共享库负载”等)的功能将是一个很好的补充。对此功能提出一个增强请求(http://bugreport.apple.com/)将会是一件很棒的事情,因为类似的错误会成为功能的投票。
顺便说一句,target.process.extra-startup-command所做的事情完全不同。它允许您在开始运行之前,在lldb发送到其调试代理(例如debugserver)的序列之前添加一些命令。它的主要用途是打开更多的debugserver日志记录。
小智 5
由于我经常返回这个问题以进行配置,因此我最终创建了一个小脚本来自动执行此操作:
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()
Run Code Online (Sandbox Code Playgroud)
要使用,请将其放入类似的内容中ignore_signals.py并从以下位置引用它.lldbinit:
command script import ~/ignore_signals.py
Run Code Online (Sandbox Code Playgroud)
我怀疑这可以进一步改进,所以我也将其放在GitHub上,以防有人愿意贡献。
| 归档时间: |
|
| 查看次数: |
2545 次 |
| 最近记录: |