我以前是asked this question,发现lldb不会通过原始信号的siginfo_t
结构中的数据。除信号编号外,其他所有内容均为0。 siginfo_t
中的信号和数据在未调试程序时按预期工作。
我正在lldb中使用process handle
子命令来确保为SIGTERM
启用了passthough,但是这似乎不起作用(或者至少没有我期望的那样)。我不知道这是否适用于所有信号,但是我对SIGTERM
特别感兴趣。
这是lldb中的错误吗?有办法控制这种行为吗?我在帮助中什么也没看到。
如果重要的话,我使用的是macOS 10.14.1(Mojave)和Xcode 10(lldb-1000.11.37.1)。
答案 0 :(得分:2)
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转发信号时,内核将不得不保留所有其他信息,将其复制过来,或者提供lldb的API来获取并随信号一起重新发送该信息。