lldb 没有正确地将“siginfo_t”转发给附加的进程信号处理程序

lldb not properly forwarding `siginfo_t` to attached process signal handler

我之前 ,发现 lldb 不会从原始信号传递来自 siginfo_t 结构的数据;除了信号编号,一切都为 0。当程序未被调试时,siginfo_t 中的信号和数据按预期工作。

我在 lldb 中使用 process handle 子命令来确保为 SIGTERM 启用直通,但这似乎不起作用(或者至少不像我预期的那样)。我不知道这是否适用于所有信号,但我对 SIGTERM.

特别感兴趣

这是 lldb 中的错误吗?有没有办法控制这种行为?我在帮助中什么也没看到。

我使用的是 macOS 10.14.1 (Mojave) 和 Xcode 10 (lldb-1000.11.37.1) 如果重要的话。

lldb 无法直接调用您的信号处理程序。据我所知,在 MacOS 上没有 "signals.h" 方法可以让一个进程向另一个进程发送包括目标线程和任何其他信息的信号。所有 pthread_kill 变体都只是本地进程。

相反,调试器通过获取 EXC_SOFTWARE/EXC_SOFT_SIGNAL Mach 异常在信号实际传送之前拦截信号。然后在恢复时,它告诉内核使用 ptrace 系统实用程序传播信号 - 使用 "PT_THUPDATE"。该定义在 usr/include/sys/ptrace.h 中。使用 PT_THUPDATE,您发送信号编号,内核将其视为原始信号被抑制,并产生一个新信号。

这个过程是有损的。最初,lldb 仅接收信号编号和目标线程,不接收任何其他信息。此外,PT_THUPDATE API 仅采用线程 ID 和信号编号。所以我们有更多的信息也没有办法转发。

内核必须保留所有其他信息,当 lldb 转发信号时,将其复制或提供 API 以便 lldb 获取并重新发送此信息以及信号。