【问题标题】:Why does a 2-stage command-line build with clang not generate a dSYM directory?为什么使用 clang 的 2 阶段命令行构建不会生成 dSYM 目录?
【发布时间】:2015-11-24 16:01:28
【问题描述】:

我有一个要调试的简单项目,想要生成带有调试符号的 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 阶段编译和链接构建生成 Lazy.dSYM?

我不需要 dSYM 目录,只是调试符号,但想了解创建它的时间和原因。

【问题讨论】:

    标签: c++ macos debugging debug-symbols


    【解决方案1】:

    .dSYM 包的创建是由一个名为dsymutil 的工具完成的。当 Apple 添加对 DWARF 调试信息的支持时,他们决定将“可执行链接”与“调试信息链接”分开。因此,调试信息链接不是由普通链接器完成的,而是由dsymutil完成的。

    为方便起见,当您一步构建程序时,编译器会代表您调用dsymutil。那是因为它知道它拥有所有的输入。如果您将-v(又名--verbose)选项添加到编译命令,您将看到dsymutil 的调用是它执行的最后一步。

    但在其他情况下,它不会这样做。它将调试信息链接步骤留给用户手动执行。您可以通过简单地发出命令来做到这一点:

    dsymutil <your_program>
    

    这是一位 Apple 工程师的an article,他帮助设计和实施了 Apple 对 DWARF 的支持,解释了他们的想法。他还在 Stack Overflow 上answered了一个关于这些东西的问题。

    【讨论】:

    • 厉害,找了好久,终于帮到我了!
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2016-01-19
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多