6

我在 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)?

4

2 回答 2

9

macOS / OS X / Darwin / Mach-O 对象默认具有“分离调试”方案。

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

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

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

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

看内容:

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

实际内容:name.dSYM/Contents/Resources/DWARF/name 也应该可以通过以下方式转储:

  • llvm-dwarfdump
  • BINUTILS objdump(如果它是为适当的 darwin 目标构建的)。
于 2018-08-01T06:34:49.503 回答
-1

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

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

于 2018-07-31T21:16:56.440 回答