我通过外部构建系统使用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版本正确设置断点?
谢谢!
答案 0 :(得分:0)
Xcode始终设置文件&断点使用它的源的完整路径的概念。当Xcode正在构建项目时,它可以确保它的完整路径来源"它提供的编译器(以及编译器随后在调试信息中写入的内容)是相同的。但是使用外部构建系统,它们可能不一样(例如,构建系统可能通过复杂的相对路径或通过符号链接等引用路径......)调试器不会解析所有源的路径文件路径,对于大型项目来说太昂贵了。因此,如果这些不符合设置断点的完整路径就不会起作用。
您可以通过设置断点,然后找到位置的地址(上例中的0x000000010027130d)并运行命令来找出调试器认为您的main.cpp有什么路径:
(lldb) image lookup -va 0x000000010027130d
其中一个输出行将是编译单元:
CompileUnit: id = {0x00000000}, file = "/tmp/hello-world.c", language = "c99"
此处给出的完整路径是否与Xcode设置断点时看到的路径相同。如果是的话我就不知道会出现什么问题,但是如果它们不是,你知道原因,这可能会指向你修复它的方向。