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

问题描述:

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

更新:

我设置的是从信号处理程序中调用断点功能。例如,当我发送一个SIGINT信号时,信号处理程序会调用一些函数来在应用程序中进行清理,并且我正在设置其中一个清理函数的断点。有时候,LLDB会停止在我设置断点的函数中(使用stop reason = breakpoint 1.1),有时它会停止在底层/包含的事件处理库中,并且如果后者是按下“c”(继续进入断点该应用程序希望并且不在事件处理库中),但有时它可以让我继续到期望的断点,其他时候它只是说“过程41524恢复”,并且我永远不能达到期望的断点。

+0

您是否使用Xcode设置断点或命令行lldb?如果Xcode,它会缓存断点,但可以在断点浏览器中禁用它们。 –

+0

如果这是命令行lldb,它不会缓存从运行到运行lldb本身,尽管它会保持您设置为活动的断点并在每次重新运行正在调试的程序时重置它们。 –

+0

如果你可以给出“break list”命令的输出和你意想不到的断点数,也许我们可以看到有趣的东西? –

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

大多数调试器都有一些方法来控制接收信号时发生的情况。在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 ,它会停在你的处理程序中。

+1

好的,谢谢。我认为没有任何改变(即它不能在开始一个过程之前配置),因为你在2013年回答这个问题http://stackoverflow.com/questions/16989988/disable-signals-at-lldb-initialization我跑了'帮助过程处理“,但没有找到更多信息 – Leahcim

+0

是的,这还没有得到修复。 –

由于故障排除指南中提到,增加了target.inline-breakpoint-strategy设置到.lldbinit文件似乎解决问题

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

更新:问题不是固定不变的,看到OP,所以这不是一个很好的解决方案(据我所知)

+0

将此行添加到'.lldbinit'中,但稍后它恢复为OP – Leahcim

+0

中描述的行为。“停在不存在的断点处”是什么意思?当你停下来时,lldb的停止原因是“断点x.x”还是EXC_BREAKPOINT?如果是后者,那么这不是一个断点lldb集合,但它是某个系统库在断言中使用相同的陷阱。为EXC_BREAKPOINT搜索StackOverflow以了解这种情况的大量示例。 –

+0

我用更详细的信息更新了OP。 – Leahcim