如何告诉 LLDB 将信号传递给程序

How to tell LLDB to pass signal onto program

我在 lldb 中为我在 MacOS 上安装的基于 C 语言的应用程序设置了很多断点。断点大多设置在应用程序的同一函数中。然而,第二天我回到应用程序继续处理它,我又开始在同一个函数中设置断点,出现了一个问题,即中断没有发生在应用程序函数内部,而是发生在其中一个函数中应用程序的底层库,每次我尝试中断函数时它都会一遍又一遍地这样做(即它在底层库中停止)并且我无法通过步进(每次我步进)达到所需的功能,它只是在底层库中向前迈进)。

更新:

我在其中设置断点的函数是从信号处理程序中调用的。例如,当我发送一个 SIGINT 信号时,信号处理程序调用一些函数来清理应用程序中的内容,并且我在其中一个进行清理的函数上设置了断点。有时,LLDB 在我设置断点的函数中停止 (with stop reason = breakpoint 1.1) ,有时它在 underlying/included 事件处理库中停止 stop reason = signal SIGSTOP ,如果是后者,如果我按"c"(希望继续进入应用程序中的断点并离开事件处理库),只是有时它会让我继续进入所需的断点,其他时候它只是说 "Process 41524 resuming" 而我永远无法得到到所需的断点。

如故障排除指南中所述,向 .lldbinit 文件添加 target.inline-breakpoint-strategy 设置似乎可以解决问题

 "settings set target.inline-breakpoint-strategy always" >> ~/.lldbinit

更新:问题未解决,请参阅 OP,因此这不是一个好的解决方案(AFAIK)

啊,那我不认为问题出在断点上,而是你的信号处理程序是否真的被调用了。

大多数调试器都有一些方法来控制接收到信号时发生的情况。在 lldb 中,这是通过 process handle 命令完成的。例如:

(lldb) process handle SIGSTOP
NAME         PASS   STOP   NOTIFY
===========  =====  =====  ======
SIGSTOP      false  true   true 

这意味着 lldb 将在您的进程收到 SIGSTOP 时停止,并会通知您有关 SIGSTOP 的信息,但不会将 SIGSTOP 传递给您正在调试的程序(因此您的处理程序不会被调用 SIGSTOP .) process handle 不带参数将为您提供所有信号的行为列表。

默认情况下我们不传递 SIGSTOP,因为它被调试器用于自己的目的,因此您可能会收到并非来自 "real" SIGSTOP 的对处理程序的调用。同样道理,SIGINT:

(lldb) process handle SIGINT
NAME         PASS   STOP   NOTIFY
===========  =====  =====  ======
SIGINT       false  true   true 

您可以轻松更改此行为,例如 SIGINT:

(lldb) process handle SIGINT -p true
NAME         PASS   STOP   NOTIFY
===========  =====  =====  ======
SIGINT       true   true   true 

然后调试器会将 SIGINT 传递给进程,它会在您的处理程序中停止。