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

时间:2016-03-25 08:45:08

标签: c++ xcode debugging lldb

我通过外部构建系统使用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版本正确设置断点?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

(lldb) image lookup -va 0x000000010027130d

其中一个输出行将是编译单元:

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

此处给出的完整路径是否与Xcode设置断点时看到的路径相同。如果是的话我就不知道会出现什么问题,但是如果它们不是,你知道原因,这可能会指向你修复它的方向。