我在 lldb 中为安装在 MacOS 上的基于 C 语言的应用程序设置了很多断点。断点大多设置在应用程序的同一函数中。然而,第二天我回到应用程序继续处理它,并开始在同一个函数中再次设置断点,出现了一个问题,断点不是发生在应用程序函数内部,而是发生在其中一个函数中。应用程序的底层库,每次我尝试中断该函数时(即它在底层库中停止),它都会一遍又一遍地执行此操作,并且我无法通过单步执行来达到所需的功能(每次我单步执行时) ,它只是在底层库中前进)。
Update:
我设置断点的函数是从信号处理程序中调用的。例如,当我发送 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
这意味着当您的进程收到 SIGSTOP 时,lldb 将停止,并通知您有关 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 传递给进程,并且它将在您的处理程序中停止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)