问题 带有静态库的iOS应用程序在Ad Hoc Archive Build的启动时总是崩溃。无法在Xcode Debugger中重现


我们有一个使用静态Lib建立的应用程序,我们也正在构建用于分发。 App和Lib在Xcode调试器中运行正常,或者在Xcode调试会话中加载到设备上。一旦我们在设备上放置了Ad Hoc Archive构建,App就会崩溃。控制台日志语句表明它在Lib代码中崩溃,但崩溃报告没有象征Lib代码。

  • 无法在Xcode Simulator中重现。
  • Guard malloc,Guard Edges什么都没显示(但这些只能在模拟器中运行)。
  • 没有泄漏
  • 使用Xcode 4.3.2
  • 应用目标4.3或更高版本。
  • Lib目标3.0或更高版本。
  • 其他链接器标志= -ObjC
  • Lib在Target“Link Binaries with Libraries”中设置为“Optional”
  • Thumb支持关闭(使用LLVM)

在控制台上看到2个可能有用的例外,但到目前为止还没有在网上做任何事情,这对此有很大帮助:

Application 'x' exited abnormally with signal 12: Bad system call: 12 (mostly)
Application 'x' exited abnormally with signal 12: Bad system call: 11 (rarely)

我们在其他地方看到了带有Recursion的静态库的问题。但是我们的Lib没有任何递归。

难倒,需要更多的想法。


11171
2018-04-24 15:11


起源

那么不是AdHoc而是在真实设备上进行Debug测试?它可以再现吗?我只想要排除在目标中建立差异的可能性。 - Kai Huppmann
没有尝试,但所有日志记录语句指向我们认为可能有缓冲区溢出的序列化代码块。不。非常非常非常。奇。 - Cliff Ribaudo


答案:


弄清楚了!! 在桌子上撞了4天后。我们不确切地知道它为什么会起作用但确实如此。如果它对其他人有帮助,这里是为我们解决它的设置。在Static Library Project的Build Settings的“Deployment”部分中设置它们:

SET "STRIP LINKED PRODUCT" (STRIP_INSTALLED_PRODUCT) = NO
SET "STRIP STYLE" = DEBUGGING SYMBOLS.

我们通过反复试验发现了这一点,但现在注意到在线重新设置用于构建iOS静态库的Xcode项目的一些讨论使用此设置。没有讨论为什么,但确实如此。

如果有人对这些lib设置为什么修复它有任何想法,你可能想在这里评论它。


14
2018-04-24 16:26



注意:我确实进入了Apple开发者论坛,并特别询问为什么这样做,以及我们为什么要这样做。到目前为止没有回应。不是偷看!我在那里打赌那里有一个小虫。如果编译器需要一个Lib的符号,它应该在编译时抛出一些警告或异常,而不仅仅是崩溃! - Cliff Ribaudo
在WWDC,我确实向Linker GURU询问了这个问题。他说这是一种方法。但建议另一种方法来构建可以剥离符号的库。当我们全力以赴时,会发布另一张纸条。 - Cliff Ribaudo
有一个类似的问题 - libdispatch在回调我的一个块时崩溃了。该块处于静态链接的伪框架中。如上所述更改链接器标志似乎解决了这个问题(实际上我改变的唯一标志是STRIP STYLE一个 - 另一个已经设置为NO)。 - Sam Deane
我们的IPA遇到了同样的问题,这个“修复”对我们有用[适用于静态lib项目]。 @CliffRibaudo关于“替代方法”的任何更新? - Nick Farina
没试过去尝试一下。但我确实注意到,如果您尝试使用Strip Linked Product设置为YES进行编译,则最新版本的Xcode现在会抛出致命异常。 - Cliff Ribaudo


我有类似的问题,并尝试更改项目构建设置,但它不适合我。最终通过更改发布的编译器优化级别设置解决了我的问题:

在Build Settings中,转到LLVM编译器4.2 - 代码生成部分,查找优化级别选项并将Release设置从Fastest,Smallest [-Os]更改为None [-O0]。

希望这可以帮助!


1
2018-02-06 12:24





AdHoc(Release)和Debug之间的构建设置不同的可能性很高。 您是否仔细检查了所有构建设置值? 特别是看ARC(自动参考计数)设置。


0
2018-04-24 15:28



我们不使用ARC。但是考虑到这一点。 - Cliff Ribaudo
在我的情况下,运行通过Ad-Hoc分发安装的发布版本时发生了崩溃,但是在运行通过Xcode安装和启动的发布版本时却没有。请注意,两者都是发布版本。 ad-hoc构建是作为归档过程的一部分创建的,因此它在技术上与发布版本不是同一个二进制文件,但是它使用相同的目标设置和相同的代码构建,这似乎意味着它是某种东西继续进行存档/重新签名/ ad-hoc安装过程,这正在发挥作用。 - Sam Deane
山姆,不。此问题与链接器的工作方式有关,请参阅接受的答案。 - Cliff Ribaudo


通过加载Xcode调试器来调试您的Production构建(可能设置为Release Build,其优化和代码生成设置与您当前正在测试的Debug构建完全不同)。


0
2018-04-24 16:25



试过了。那条路跑在同一个地方坠毁,什么都没告诉我们。 - Cliff Ribaudo