gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:30:55 26 4
gpt4 key购买 nike

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

更新:

我在其中设置断点的函数是从信号处理程序中调用的。例如,当我发送一个 SIGINT 信号时,信号处理程序调用一些函数来清理应用程序,并且我正在清理这些函数之一上设置断点。有时,LLDB 在我设置断点的函数中停止(使用 stop reason = breakpoint 1.1 ),有时它在底层/包含的事件处理库中停止使用 stop reason = signal SIGSTOP并且,如果是后者,如果我按“c”(希望继续到应用程序中的断点并退出事件处理库),只有有时它让我继续到所需的断点,有时它只是说“处理 41524恢复”,我永远无法到达所需的断点。

最佳答案

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

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

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

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

默认情况下,我们不传递 SIGSTOP,因为调试器将其用于自己的目的,因此您可能会收到并非来自“真实”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 传递给进程,它会在您的处理程序中停止。

关于lldb - 如何告诉 LLDB 将信号传递给程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42522683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com