EXC_BAD_ACCESS 仅在运行 iOS 8 的 xcode 8 上

Posted

技术标签:

【中文标题】EXC_BAD_ACCESS 仅在运行 iOS 8 的 xcode 8 上【英文标题】:EXC_BAD_ACCESS only on xcode 8 running iOS 8 【发布时间】:2017-02-05 17:11:48 【问题描述】:

当从 xcode 7 编译 ios 8 到 10 时,该应用程序运行良好,但从 xcode 8 编译时,该应用程序仅在 iOS 8 上的 iOS 9 和 10 上正常工作,应用程序崩溃不一致。有时它会停在一个随机的 UI 元素上,例如:

但更多时候它只会在 main 处崩溃:

* thread #1: tid = 0x11d655, 0x35deaf56 libobjc.A.dylib`objc_msgSend + 22, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xf632d5c1)
frame #0: 0x35deaf56 libobjc.A.dylib`objc_msgSend + 22
frame #1: 0x2db167ea CoreUI`-[CUINamedImage initWithName:usingRenditionKey:fromTheme:] + 98
frame #2: 0x2db21d48 CoreUI`-[CUICatalog imageWithName:scaleFactor:deviceIdiom:deviceSubtype:sizeClassHorizontal:sizeClassVertical:] + 128
frame #3: 0x2b8aee98 UIKit`__98-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:]_block_invoke + 240
frame #4: 0x2b8aecea UIKit`-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:] + 230
frame #5: 0x2b95df86 UIKit`-[UIImageAsset imageWithTraitCollection:] + 474
frame #6: 0x2b58d9d2 UIKit`-[UIImageView _resolveImageForTrait:] + 286
frame #7: 0x2b58d690 UIKit`-[UIImageView _didMoveFromWindow:toWindow:] + 156
frame #8: 0x2b28aef4 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 656
frame #9: 0x2b300d50 UIKit`-[UIControl _didMoveFromWindow:toWindow:] + 44
frame #10: 0x2b28aef4 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 656
frame #11: 0x2b28aef4 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 656
frame #12: 0x2b28aef4 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 656
frame #13: 0x2b28a804 UIKit`__45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 112
frame #14: 0x2b28a720 UIKit`-[UIView(Hierarchy) _postMovedFromSuperview:] + 428
frame #15: 0x2b294bce UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] + 1462
frame #16: 0x2b29460e UIKit`-[UIView(Hierarchy) addSubview:] + 30
frame #17: 0x2b459eae UIKit`__53-[_UINavigationParallaxTransition animateTransition:]_block_invoke + 1262
frame #18: 0x2b29ada4 UIKit`+[UIView(Animation) performWithoutAnimation:] + 72
frame #19: 0x2b45977c UIKit`-[_UINavigationParallaxTransition animateTransition:] + 812
frame #20: 0x2b417cfc UIKit`-[UINavigationController _startCustomTransition:] + 2860
frame #21: 0x2b337026 UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 422
frame #22: 0x2b336e2c UIKit`-[UINavigationController __viewWillLayoutSubviews] + 44
frame #23: 0x2b336dc0 UIKit`-[UILayoutContainerView layoutSubviews] + 184
frame #24: 0x2b28b7fe UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 514
frame #25: 0x2acb1834 QuartzCore`-[CALayer layoutSublayers] + 136
frame #26: 0x2acad20c QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 360
frame #27: 0x2acad094 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
frame #28: 0x2acaca70 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 224
frame #29: 0x2acac874 QuartzCore`CA::Transaction::commit() + 324
frame #30: 0x2aca674c QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 56
frame #31: 0x27d37ffc CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
frame #32: 0x27d356ba CoreFoundation`__CFRunLoopDoObservers + 278
frame #33: 0x27d35ac2 CoreFoundation`__CFRunLoopRun + 914
frame #34: 0x27c833b0 CoreFoundation`CFRunLoopRunSpecific + 476
frame #35: 0x27c831c2 CoreFoundation`CFRunLoopRunInMode + 106
frame #36: 0x2f1f2200 GraphicsServices`GSEventRunModal + 136
frame #37: 0x2b2ed43c UIKit`UIApplicationMain + 1440
* frame #38: 0x0017bf62 Dev`main(argc=1, argv=0x01549a28) + 106 at main.m:14
frame #39: 0x3636aaae libdyld.dylib`start + 2

我已经启用了 NSZombies,但我没有得到任何新信息。我也试过打开地址清理器,它也会偶尔崩溃,但通常也会在 main 方法:

thread #1: tid = 0x11d992, 0x020fce9e libclang_rt.asan_ios_dynamic.dylib`__asan::AsanDie(), queue = 'com.apple.main-thread', stop reason = Attempt to free a non-allocated address

"access_size" : 0,
  "access_type" : 0,
  "address" : 103442256,
  "description" : "Attempt to free a non-allocated address",
  "instrumentation_class" : "AddressSanitizer",
  "pc" : 0,
  "stop_type" : "fatal_error"

从 Xcode 7 或 iOS 9 或 10 的 Xcode 8 构建时,应用再次运行良好。只有在 iOS 8 的 Xcode 8 构建时才会出现这种情况。有什么想法吗?

【问题讨论】:

【参考方案1】:

团队中的其他人找到了答案。假的。

https://forums.developer.apple.com/thread/60919

使用 Xcode 8 GM,如果您包含 16 位或 P3,则会出现此错误 应用程序提交中针对 iOS 版本早于 iOS 的资产 9.3.如果您的应用需要广色域功能,您必须将您的部署目标更改为 iOS 9.3 或更高版本。如果您的应用没有 需要广泛的颜色功能,并且您希望将其部署到较旧的 iOS 版本,那么您应该将所有 16 位或 P3 资产替换为 8 位 sRGB 资源。您可以通过运行找到 16 位或 P3 资产 错误消息中命名的资产目录上的“assetutil”来自 iTunes 连接。以下步骤概述了该过程:

    创建一个可检查的 .ipa 文件。在 Xcode Organizer (Xcode->Window->Organizer) 中,选择要检查的存档,单击 “Export...”,然后选择“Export for Enterprise or Ad-Hoc Deployment”。 这将为您的应用创建 .ipa 文件的本地副本。 找到该 .ipa 文件并将其扩展名更改为 .zip。 展开 .zip 文件。这将生成一个 Payload 文件夹,其中包含您的 .app 包。

    打开终端并将工作目录更改为 .app 包的顶层 cd path/to/Payload/your.app

    使用查找工具在您的 .app 包中查找 Assets.car 文件,如下所示:查找。 -name 'Assets.car'

    使用assetutil 工具在您的应用程序具有的每个Assets.car 中查找任何16 位或P3 资产,如下所示。 : sudo xcrun --sdk iphoneosassetutil --info /path/to/a/Assets.car > /tmp/Assets.json

    检查生成的 /tmp/Assets.json 并查找包含“DisplayGamut”的任何内容:“P3”及其关联的“名称”。这会 是包含一个或多个 16 位或 P3 的图像集的名称 资产。

    用 8 位/sRGB 资源替换这些资源,然后重新构建您的应用程序。更新:如果您的部署目标设置为 8.3 或 8.4 并且您有一个资产目录,那么您将收到同样的错误 消息,即使您实际上没有 16 位或 P3 资产。在 在这种情况下,您需要将部署目标降低到 8.2, 或将其移至 9.x。

更新:如果您的部署目标设置为 8.3 或 8.4,并且您有资产目录,那么即使您实际上没有 16 位或 P3,您也会收到同样的错误消息资产。在这种情况下,您需要将部署目标降低到 8.2,或者将其升级到 9.x。

【讨论】:

非常感谢,将目标降低到 8.2 解决了我的问题! 谢谢,这对我帮助很大! 8.2 也对我有用。 也帮助了我!要从***.com/a/39570973 的答案中借用,您只需运行sips -m ... 命令来修复您的资产。

以上是关于EXC_BAD_ACCESS 仅在运行 iOS 8 的 xcode 8 上的主要内容,如果未能解决你的问题,请参考以下文章

Nativescript throwing Thread 1: EXC_BAD_ACCESS (code=1, address=0x1edf38) 仅在 Xcode

presentViewController 在 iOS 8 上因 EXC_BAD_ACCESS 而崩溃

EXC_BAD_ACCESS 仅在从 UITableView 中一直向下滚动返回时

EXC_BAD_ACCESS KERN_INVALID_ADDRESS ios 11.2 swift 4.0

IOS4.2 应用程序以 EXC_BAD_ACCESS 退出

CGContextStrokePath 在 iOS > 5 中触发 EXC_BAD_ACCESS [重复]