为什么使用 clang 的两阶段命令行构建不生成 dSYM 目录?
Why does a 2-stage command-line build with clang not generate a dSYM directory?
我有一个简单的项目我想调试想要生成带有调试符号的 dSYM 文件夹。
运行:
clang++ -std=c++14 -stdlib=libc++ -g -o Lazy Lazy.cpp
如我所料创建 Lazy.dSYM。
但是:
clang++ -std=c++14 -stdlib=libc++ -g -c Lazy.cpp
clang++ -stdlib=libc++ -g -o Lazy Lazy.o
不创建Lazy.dSYM(符号似乎嵌入在二进制文件中)。
遗憾的是,两步构建是我修改后的 makefile 所做的。如何从 2 阶段编译和 link 构建生成 Lazy.dSYM?
我不需要 dSYM 目录,只是调试符号,但想了解创建它的时间和原因。
.dSYM 包的创建是通过名为 dsymutil
的工具完成的。当 Apple 添加对 DWARF 调试信息的支持时,他们决定将 "executable linking" 与 "debug information linking" 分开。因此,调试信息链接不是由普通链接器完成的,它是由 dsymutil
.
完成的
为方便起见,当您一步构建一个程序时,编译器会代表您调用 dsymutil
。那是因为它知道它拥有所有的输入。如果您将 -v
(a.k.a. --verbose
) 选项添加到编译命令,您将看到 dsymutil
的调用作为它执行的最后一步。
但在其他情况下,它不会这样做。它将调试信息链接步骤留给用户手动完成。您可以通过简单地发出命令来完成:
dsymutil <your_program>
这里 an article by an Apple engineer who helped design and implement Apple's support for DWARF explaining their thinking. He also answered 关于 Stack Overflow 的一个问题。
我有一个简单的项目我想调试想要生成带有调试符号的 dSYM 文件夹。
运行:
clang++ -std=c++14 -stdlib=libc++ -g -o Lazy Lazy.cpp
如我所料创建 Lazy.dSYM。
但是:
clang++ -std=c++14 -stdlib=libc++ -g -c Lazy.cpp
clang++ -stdlib=libc++ -g -o Lazy Lazy.o
不创建Lazy.dSYM(符号似乎嵌入在二进制文件中)。
遗憾的是,两步构建是我修改后的 makefile 所做的。如何从 2 阶段编译和 link 构建生成 Lazy.dSYM?
我不需要 dSYM 目录,只是调试符号,但想了解创建它的时间和原因。
.dSYM 包的创建是通过名为 dsymutil
的工具完成的。当 Apple 添加对 DWARF 调试信息的支持时,他们决定将 "executable linking" 与 "debug information linking" 分开。因此,调试信息链接不是由普通链接器完成的,它是由 dsymutil
.
为方便起见,当您一步构建一个程序时,编译器会代表您调用 dsymutil
。那是因为它知道它拥有所有的输入。如果您将 -v
(a.k.a. --verbose
) 选项添加到编译命令,您将看到 dsymutil
的调用作为它执行的最后一步。
但在其他情况下,它不会这样做。它将调试信息链接步骤留给用户手动完成。您可以通过简单地发出命令来完成:
dsymutil <your_program>
这里 an article by an Apple engineer who helped design and implement Apple's support for DWARF explaining their thinking. He also answered 关于 Stack Overflow 的一个问题。