cmake 使用 macOS 上的 makefile 生成器创建的 <target>.dSYM 目录中有什么?

What is in the <target>.dSYM directories created by cmake with the makefile generator on macos?

我在 MacOS 上使用 CMake 为我的 C++ 项目生成 Makefile。当我构建一个目标(比如,test/AsyncTest)时,我得到了那个目标,加上一个包含以下内容的 test/AsyncTest.dSYM/ 目录:

test/AsyncTest.dSYM/Contents/Resources/DWARF/AsyncTest
test/AsyncTest.dSYM/Contents/Info.plist

我猜这是调试信息(基于“.dSYM”和 "DWARF" 线索),但我还没有找到可以让我检查 AsyncTest 文件的工具。 dwarfdump不认识

那么,这个文件究竟是什么?有没有我可以用来转储符号信息的工具(假设它是什么)?为什么 CMake 在我没有要求时生成它?我可以生成它吗(因为生成的文件是huuuuge)?

我不知道里面到底有什么,但它肯定与调试相关,而不是 cmake 的错:"c++ -g test.cpp -o test" 也会生成它。

我知道关闭它的唯一方法是不在调试模式下编译:将 -DCMAKE_BUILD_TYPE=Release 传递给 cmake。

macOS / OS X / Darwin / Mach-O objects 默认有一个 "separated debug" 方案。

链接 exe 时,静态链接器 (ld64) 不包含 exe 中的调试数据。

但是,静态链接器记录(在 exe 符号中 table)它链接的目标文件的名称

第二个工具(调试链接器,名为 dsymutil)使用 exe 文件 table 和原始对象并链接调试 - 生成包含链接调试的标准 mach-o 包结构。 [默认 name.dSYM] 其中 "name" 是 exe 的名称。

LLDB 和某些版本的 GDB 可以使用这个包来提供他们需要的调试数据。

看内容:

Xcode “dwarfdump” 实用程序可以理解包 (dwarfdump name.dSYM)。

实际内容: name.dSYM/Contents/Resources/DWARF/name 也应该可以被转储:

  • llvm-dwarfdump
  • BINUTILS objdump(如果它是为适当的 darwin 目标构建的)。