【问题标题】:xcode 10 debugger stops on some breakpoints and don't on some othersxcode 10 调试器在某些断点上停止,而在其他一些断点上停止
【发布时间】:2019-07-09 22:35:34
【问题描述】:
有效的断点被定义了两次(我不知道它们是如何或为什么被创建两次)。编辑这些断点时,条件项有两个单选按钮。第一个带有文本:“使用未设置的父断点条件”。另一个单选按钮靠近条件的“经典”文本字段。不起作用的断点只有条件的文本字段。我找不到任何文档。我的问题:是什么让我产生一种断点和另一种?它是一个错误吗? (只有工作的,应该生产带有单选按钮的?)。我不清楚。文本是什么意思:“使用未设置的父断点条件”?什么是父断点?为什么它们在工作时是成对产生的?实际上设置一个工作断点似乎对我来说是随机的。有没有人遇到同样的问题?
【问题讨论】:
标签:
xcode
debugging
breakpoints
【解决方案1】:
Xcode 断点显示反映了 lldb 在幕后处理断点的方式。
lldb 断点分为两部分。
第一部分是“断点规范”——例如“文件 foo.c 的第 12 行”或“名为 foo 的符号”。 lldb 还允许更广泛的搜索规范,例如“任何匹配正则表达式的函数名称”(break set -r) 甚至“匹配给定正则表达式的任何源代码行”(break set -p),尽管 Xcode 没有这些爱好者的 UI那些。
Xcode显示中断点的根节点代表断点规范。
每个规范都可以解析到为您的应用程序生成的代码中的一个或多个位置。例如,如果断点位于头文件中的可内联函数上,则会发生这种情况,该函数会将代码发送到包含头文件并使用该函数的每个编译单元中。或者您是否设置了一个符号断点,并且该名称显示在多个共享库中。当您在像
这样的源代码行上设置断点时,也会发生这种情况
for (i = foo(); i < bar(); i += baz()) {
因为该源代码行提供了在 for 循环评估的三个不同部分中运行的代码。
因此,Xcode 中列出的每个断点的子节点会向您显示生成的代码中与断点规范匹配的各个位置。
如果断点没有位置节点,则意味着 lldb 在您的代码中找不到任何符合规范的位置。如果您发出以下命令,有时您可以更清楚地看到这一点:
(lldb) break list
lldb 控制台中的命令。
根据您的描述,我无法解释为什么您的某些断点无法解析到代码中的位置。例如,如果您在构建时没有调试信息的源文件中设置了断点,就会发生这种情况。如果源位置位于条件失败的某些#ifdef 之间,则可能会发生这种情况,因此不会为这些行发出任何代码。我需要更多详细信息才能知道为什么您的特定断点没有解析。