如何告诉LLDB将信号传递到程序
我在lldb中为我安装在MacOS上的基于C语言的应用程序设置了很多断点。断点大多在应用程序中设置为相同的功能。然而,第二天我回到应用程序继续工作,并且我开始在同一个函数中再次设置断点,出现了一个问题,即应用程序函数内部没有发生中断,而是出现在该应用程序的底层库,并且每当我尝试打破该函数时(例如停止在底层库中),它都会一遍又一遍地执行此操作,并且我无法通过步进来达到所需的功能(每次我步,它只是在底层库中向前迈进)。如何告诉LLDB将信号传递到程序
更新:
我设置的是从信号处理程序中调用断点功能。例如,当我发送一个SIGINT信号时,信号处理程序会调用一些函数来在应用程序中进行清理,并且我正在设置其中一个清理函数的断点。有时候,LLDB会停止在我设置断点的函数中(使用stop reason = breakpoint 1.1
),有时它会停止在底层/包含的事件处理库中,并且如果后者是按下“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
您可以轻松地改变这种行为,例如用于信号情报:
(lldb) process handle SIGINT -p true
NAME PASS STOP NOTIFY
=========== ===== ===== ======
SIGINT true true true
然后调试器会传递给进程SIGINT ,它会停在你的处理程序中。
好的,谢谢。我认为没有任何改变(即它不能在开始一个过程之前配置),因为你在2013年回答这个问题http://stackoverflow.com/questions/16989988/disable-signals-at-lldb-initialization我跑了'帮助过程处理“,但没有找到更多信息 – Leahcim
是的,这还没有得到修复。 –
由于故障排除指南中提到,增加了target.inline-breakpoint-strategy
设置到.lldbinit文件似乎解决问题
"settings set target.inline-breakpoint-strategy always" >> ~/.lldbinit
更新:问题不是固定不变的,看到OP,所以这不是一个很好的解决方案(据我所知)
您是否使用Xcode设置断点或命令行lldb?如果Xcode,它会缓存断点,但可以在断点浏览器中禁用它们。 –
如果这是命令行lldb,它不会缓存从运行到运行lldb本身,尽管它会保持您设置为活动的断点并在每次重新运行正在调试的程序时重置它们。 –
如果你可以给出“break list”命令的输出和你意想不到的断点数,也许我们可以看到有趣的东西? –