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

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

本文关键字:找不到 我的 源文件 LLDB gt v320 为什么      更新时间:2023-10-16

Im通过外部构建系统使用Xcode进行C++开发。如果我使用Xcode6.2(lldb320.4.160),一切都很好,我可以设置断点,它们会被击中——一切都很不错。但是,如果我想升级到Xcode的新版本,例如7.3(lldb350.0.213),我的断点将不再被击中。到目前为止,我的研究告诉我,由于某种原因,新的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)

最后的CCD_ 2表明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 

这个断点在程序执行过程中被击中-一切都很好

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

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

谢谢!

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

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

(lldb) image lookup -va 0x000000010027130d

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

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

这里给出的完整路径与Xcode设置断点时看到的路径相同吗。如果是,我不知道可能出了什么问题,但如果不是,你知道原因,这可能会给你指明解决问题的方向。