为什么 lldb > v320.4.160 找不到我的源文件了?

why can't lldb > v320.4.160 find my source files anymore?

我正在使用 Xcode 通过外部构建系统进行 C++ 开发。如果我使用 Xcode 6.2 (lldb 320.4.160) 一切正常,我可以设置断点,它们正在被击中 -一切都很好。但是,如果我想升级到 Xcode 的更新版本,例如7.3 (lldb 350.0.21.3) 我的断点不再被命中。到目前为止,我的研究告诉我新的 lldb 出于某种原因无法设置断点。

一旦我停止执行程序并键入 (lldb) breakpoint list,我的输出如下所示:

Current breakpoints:
  1: file = '/full/path/to/src/main.cpp',       line = 842, exact_match = 0, locations = 0 (pending)
  2: file =     '/full/path/to/src/class.cpp', line    = 383, exact_match = 0, locations = 0 (pending)
  3: file = '/full/path/to/src/Homie.cpp',  line = 12, exact_match = 0, locations = 0 (pending)

最后的(pending)说明bp设置不正确。如果我现在通过 breakpoint set --file main.cpp --line 842 在 lldb 中设置一个断点,我会得到一个 (lldb) breakpoint list 给出以下输出的断点:

4: file = 'main.cpp', line = 12, exact_match = 0, locations = 1, resolved = 1, hit count = 0
  4.1: where = TEST`::__cxx_global_array_dtor() + 29 at main.cpp:842, address = 0x000000010027130d, resolved, hit count = 0 

在程序执行期间命中断点 - 一切正常

如果我尝试使用 Xcode 6.2 在同一个可执行文件上设置断点,即使有完整的文件路径,调试器也可以成功找到源文件。

如何让新的lldb版本正确设置断点?

谢谢!

Xcode 总是使用源的完整路径概念来设置文件和行断点。当 Xcode 构建项目时,它可以确保它的 "full path to source" 和它提供给编译器的内容(以及编译器随后写入调试信息的内容)是相同的。但是对于外部构建系统,它们可能不相同(例如,构建系统可能通过复杂的相对路径或通过符号链接等引用路径)调试器不会解析所有源文件路径的路径,这对于大型项目来说太昂贵了。因此,如果这些不匹配,则通过完整路径设置断点将不起作用。

您可以通过设置断点找到调试器认为您的 main.cpp 的路径,然后找到该位置的地址(上例中的 0x000000010027130d)和 运行 命令:

(lldb) image lookup -va 0x000000010027130d

输出行之一将是编译单元:

  CompileUnit: id = {0x00000000}, file = "/tmp/hello-world.c", language = "c99"

这里给出的完整路径和你在Xcode设置断点时看到的一样吗?如果是,那么我不知道会出现什么问题,但如果不是,您知道原因,这可能会为您指出修复问题的方向。