dsymutil 的 --flat 选项的预期用途是什么

What is the intended use of the --flat option to dsymutil

dsymutil 手册页指出 dsymutil 有一个名为 --flat 的选项,它将创建单个文件调试包,扩展名为 .dwarf。我试过了,虽然确实创建了预期的 .dwarf 文件,但 lldb 似乎并没有实际加载它们,这与生成常规 .dSYM 目录不同。除了手册页所说的,我找不到很多文档。

此类文件是否有预期的方案,或者这是很久以前遗留下来的不应再使用的东西?

它很有吸引力,因为作为单个文件,在构建系统中管理它会更容易,而不是需要管理生成的 .dSYM 目录。

$ cat > hello_world.cpp
#include <iostream>

int main() {
    std::cout << "Hello, World\n";
    return 0;
}

$ clang++ ./hello_world.cpp -g -c -o hello_world.o
$ clang++ ./hello_world.o -o hello_world

$ dsymutil ./hello_world

$ tree ./hello_world.dSYM
./hello_world.dSYM
└── Contents
    ├── Info.plist
    └── Resources
        └── DWARF
            └── hello_world

$ lldb hello_world
(lldb) target create "./hello_world"
Current executable set to './hello_world' (x86_64).
(lldb) image list
[  0] 7984B8FE-1C4E-3468-9819-C3BE4E50456D 0x0000000100000000 .../hello_world
      .../hello_world.dSYM/Contents/Resources/DWARF/hello_world

$ \rm -rf hello_world.dSYM
$ dsymutil --flat ./hello_world
$ file hello_world.dwarf
hello_world.dwarf: Mach-O 64-bit dSYM companion file x86_64

(lldb) target create "./hello_world"
Current executable set to './hello_world' (x86_64).
(lldb) image list
[  0] 7984B8FE-1C4E-3468-9819-C3BE4E50456D 0x0000000100000000 .../hello_world
[  1] F217F7F8-A795-3109-B77F-B1E2277F3E3B 0x0000000000000000 /usr/lib/dyld

如您所见,lldb 愉快地自动查找并加载 .dSYM,但不会为 .dwarf 文件版本这样做。

有没有办法让 lldb 加载这些文件,或者更好的是,自动加载它们?其他工具? "link up" 可执行文件到 .dwarf 文件是否需要其他一些步骤,就像 --add-gnu-debuglink 的模拟?或者 dsymutil --flat 是不是真正支持并且应该避免的东西?它有任何用例吗?

--flat 选项不受真正支持。它的存在是为了测试,我们通常要检查生成的 DWARF,而不是应该始终相同的 dSYM 包结构。