存档时,iOS静态库调试符号未包含在应用的dSYM文件中

问题描述

问题描述:

我有一个Xcode工作区,它引用了两个Xcode项目。第一个Xcode项目(lib.xcodeproj)构建一个iOS静态库,而第二个项目(app.xcodeproj)构建一个使用该静态库的iOS应用。 app.xcodeproj个引用lib.xcodeproj,即lib.xcodeproj链接二进制文件和库构建阶段中列出了app.xcodeproj。 因此,设置如下:

MyApp.xcworkspace
  |
  +-app.xcodeproj---+
  |                 | Referenced via build phase
  +-lib.xcodeproj <-+

如果我在Xcode中打开此工作区并从中建立归档文件Product -> Archive),则所有内容都会按预期编译,最后我得到.xcarchive 。如果我通过命令行(xcodebuild archive -workspace MyApp.xcworkspace ...)进行构建,则同样适用。

但是,转储作为存档一部分生成的dSYM文件内容表明,该文件不包含静态库(lib.xcodeproj)的调试符号。更具体地说,执行命令

dwarfdump MyApp.xcarchive\dSYMs\MyApp.app.dSYM\Contents\Resources\DWARF\MyApp > dwarfdump.txt

生成一个文本文件,该文本文件确认应用程序本身的所有调试符号都在其中,而静态库的调试符号不存在。

这仅在创建档案时发生。通过Product菜单-> Build生成一个生成的dSYM文件,其中包含应用程序的所有调试符号和静态库。

现在,这并不是完全新的。该行为早在很久以前就已经观察到,我发现三个描述相同行为的不同SO帖子(hereherehere)。但是,这些帖子已经超过7年了!


我想知道的事情:

其他人如何创建使用在同一工作区中创建的静态库的应用程序存档?

似乎没有脚本,仅靠Xcode本身,这是一个无法解决的问题。


分析(对于好奇的读者):

我已经分析了这个问题,并强烈怀疑这是一个持久的Xcode问题。这是我发现的:

通过xcodebuild build -workspace MyApp.xcworkspace ...构建工作区会产生以下日志条目序列:

CompileC <static library file 1>
CompileC <static library file 2>
...
Libtool <instructions to create the static library>
...
CompileC <app file 1>
CompileC <app file 2>
...
GenerateDSYMFile <instructions to create the dSYM file>
...
CodeSign <instructions to sign the app>

通过xcodebuild archive -workspace MyApp.xcworkspace ...构建工作区会产生以下日志条目序列:

CompileC <static library file 1>
CompileC <static library file 2>
...
Libtool <instructions to create the static library>
Strip <instructions to strip the debugging symbols from the static library>
...
CompileC <app file 1>
CompileC <app file 2>
...
GenerateDSYMFile <instructions to create the dSYM file>
Strip <instructions to strip the debugging symbols from the app>
...
CodeSign <instructions to sign the app>

从这两个序列中我们可以看到,在创建存档时,我们会调用strip工具。该工具从二进制文件删除调试符号。因此,当创建dSYM文件时,静态库根本不再包含任何调试符号。

执行GenerateDSYMFile时,剩下的只是应用程序内的调试符号。这些符号然后也被剥离。但是在dSYM文件已经存在之后而不是在静态库中那样删除它们。

现在,有一些旨在影响该行为的构建设置。我发现以下内容并测试了它们是否有效果

  • Strip Debug Symbols During copycopY_PHASE_STRIP):没什么区别,顺序不变
  • Strip Linked ProductSTRIP_INSTALLED_PRODUCT):没什么区别,顺序不变
  • Strip StyleSTRIP_STYLE):更改传递到strip工具的参数。但是我仍然不能阻止信息剥离。

因此,凭借这些信息,我敢于声明Xcode对该星座使用的构建过程完全不正确。正确的方法是运行GenerateDSYMFile,然后在静态库和应用程序运行strip之后运行。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)