【问题标题】:How to tell LLDB to pass signal onto program如何告诉 LLDB 将信号传递给程序
【发布时间】:2017-03-01 03:33:14
【问题描述】:

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

更新:

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

【问题讨论】:

  • 你是使用Xcode设置断点还是命令行lldb?如果是 Xcode,它会缓存断点,但您可以在 Breakpoints Navigator 中禁用它们。
  • 如果这是命令行 lldb,它不会在运行之间缓存 lldb 本身,尽管它确实会保持您设置的断点处于活动状态并在每次重新运行程序时重置它们调试。
  • 如果你能给出“break list”命令的输出和你意外命中的断点号,也许我们能看到一些有趣的东西?
  • 我更新了问题的标题,以解决我在发现它不是缓存相关问题后遇到的问题。
  • @JimIngham 我在答案中发布的解决方案有时有效,但随后又恢复为 OP 中的行为。关于问题可能是什么的任何建议?它再次在底层库中停止。

标签: lldb


【解决方案1】:

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

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

【讨论】:

  • 好的,谢谢。我认为自从您在 2013 年对这个问题的回答 stackoverflow.com/questions/16989988/… 我跑了 help process handle 并没有找到更多信息后,我认为没有任何改变(即在开始进程之前无法对其进行配置)
  • 是的,还没有解决。
【解决方案2】:

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

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

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

【讨论】:

  • 将此行添加到 .lldbinit 工作了一段时间,但随后又恢复到 OP 中描述的行为
  • “在不存在的断点处停止”是什么意思?当你停止时,lldb的停止原因是“断点x.x”还是EXC_BREAKPOINT?如果是后者,那么这不是一个断点 lldb 集,而是某个系统库在断言中使用了相同的陷阱。在 StackOverflow 中搜索 EXC_BREAKPOINT 以获取大量发生这种情况的示例。
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多