XCode 调试器 lldb 在没有错误输出的情况下中断,但程序工作正常

Posted

技术标签:

【中文标题】XCode 调试器 lldb 在没有错误输出的情况下中断,但程序工作正常【英文标题】:XCode debugger lldb breaks without error output but program works fine 【发布时间】:2015-02-17 14:59:48 【问题描述】:

我最近在我的项目中遇到了一个奇怪的行为。 它使用 Objective-C 作为输出,但大部分核心是 C++11。许多 C++ 例程仅在标头内内联。该应用程序正在通过伯克利套接字与服务器通信。此外,该应用程序在模拟器和实际设备上运行良好。我的日志没问题,应用程序按预期运行...... ...只要我不使用 XCode 调试器。

调试器总是在我发送保持活动状态的同一行代码中中断。这是由第二个线程完成的。如果我注释掉这一行,它将停在下一行。如果我将return 直接放在方法的开头,它会在返回处停止(顺便说一句,它是一个内联方法)。如果我注释掉调用,它会停在我使用该方法的下一个地方。如果我点击继续,APP 将按预期工作,直到下一次调用发生。 在日志窗口中只有一个输出(在我的日志之后):

(lldb)

我已经尝试清理我的应用程序(“~library/developer/xcode”)并重新启动所有应用程序。没有效果。

不幸的是,我发现无法用小样本重现问题。

我的问题,有没有人遇到过类似的问题?有没有办法获取 lldb 导致停止的信息?

【问题讨论】:

尝试在 lldb 提示符下输入 thread infothread list。这将向您显示每个线程的“停止原因”。例如如果你遇到断点,它会这么说。如果我附加到暂停它的进程,它将显示SIGSTOP。我不知道你会说什么,但它可能有助于了解正在发生的事情。 @这下次会派上用场:-)我找到了原因并会回答我的问题。 【参考方案1】:

我重新排列代码后发现了问题,因为我认为这可能是调用堆栈的损坏。

这听起来很尴尬,但它是一个断点!问题是,它不可见。调试过的人都知道,在一行中设置断点,如果无法设置断点,断点会滑到下一个逻辑位置。此位置始终在您设置的方法范围内。 使用 C++11 和内联方法调用内联方法,这条规则似乎不再牢不可破。断点不在定义和第一个内联方法之间的有效代码区域中。根据首先编译的方法,断点似乎在一些常规代码中移动。清除应用缓存并没有消除断点。不幸的是(当然)lldb 并没有告诉你它因为你设置的断点而中断。

Jason Molenda 写了以下评论,这将有助于其他面临类似问题的人,我在回答中添加了因为不是每个人都阅读 cmets:

尝试在 lldb 提示符或线程列表中键入线程信息。这会 向您展示每个线程的“停止原因”。例如如果你打了 断点,它会这么说。如果我附加到一个暂停的进程 它,它会说 SIGSTOP。我不知道你会说什么,但它可能 帮助了解正在发生的事情。

【讨论】:

以上是关于XCode 调试器 lldb 在没有错误输出的情况下中断,但程序工作正常的主要内容,如果未能解决你的问题,请参考以下文章

lldb 没有按需生成任何数据

XCode 9 停止调试和运行应用程序并给出错误“LLDB RPC 服务器已崩溃。”

ios逆向过程中lldb调试技巧-po篇

Xcode 8 beta LLDB 不断崩溃

Xcode/LLDB:如何获取有关刚刚抛出的异常的信息?

使用 lldb/Xcode 进行远程调试