Ios 无法跟踪[NSData getBytes:length:]崩溃

Ios 无法跟踪[NSData getBytes:length:]崩溃,ios,objective-c,crash,nsdata,exc-bad-access,Ios,Objective C,Crash,Nsdata,Exc Bad Access,我在基金会的-[NSData(NSData)getBytes:length:][/code>方法中遇到了一个奇怪的EXC\u BAD\u访问崩溃。这种情况经常发生,但我无法从堆栈跟踪中获得任何有意义的信息。除了开源库(一个在SDWebImage中,一个在SocketRocket中),我的代码中没有对getBytes:length:的调用,但它们似乎并没有导致崩溃 唯一的提示是崩溃发生在com.apple.CFNetwork.addPersistCacheToStorageDaemon线程中,但我

我在基金会的
-[NSData(NSData)getBytes:length:][/code>方法中遇到了一个奇怪的
EXC\u BAD\u访问
崩溃。这种情况经常发生,但我无法从堆栈跟踪中获得任何有意义的信息。除了开源库(一个在
SDWebImage
中,一个在
SocketRocket
中),我的代码中没有对
getBytes:length:
的调用,但它们似乎并没有导致崩溃

唯一的提示是崩溃发生在
com.apple.CFNetwork.addPersistCacheToStorageDaemon
线程中,但我不知道它是关于什么的。有人能帮忙吗

来自Crashlytics的Stacktrace:

Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon
0  libsystem_platform.dylib       0x3044a208 _platform_memmove$VARIANT$CortexA9 + 160
1  Foundation                     0x22df9167 -[NSData(NSData) getBytes:length:] + 118
2  Foundation                     0x22df9167 -[NSData(NSData) getBytes:length:] + 118
3  Foundation                     0x22e21a1b -[NSData(NSData) replacementObjectForCoder:] + 134
4  Foundation                     0x22dc2aff -[NSXPCEncoder _replaceObject:] + 90
5  Foundation                     0x22e240dd -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 192
6  Foundation                     0x22e212ff -[NSDictionary(NSDictionary) encodeWithCoder:] + 922
7  Foundation                     0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604
8  Foundation                     0x22dc379d encodeInvocationArguments + 460
9  Foundation                     0x22dc3455 -[NSXPCEncoder encodeInvocation:] + 360
10 Foundation                     0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604
11 Foundation                     0x22dc2335 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 1860
12 Foundation                     0x22dd2823 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:] + 58
13 Foundation                     0x22dd27db -[_NSXPCDistantObjectWithError forwardInvocation:] + 114
14 CoreFoundation                 0x2217e831 ___forwarding___ + 352
15 CoreFoundation                 0x220afb88 _CF_forwarding_prep_0 + 24
16 CFNetwork                      0x21c52ac9 -[NSURLStorage_CacheClient addCachedResponseWithDictionary:key:] + 120
17 CFNetwork                      0x21c21e29 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1576
18 libdispatch.dylib              0x302cf423 _dispatch_call_block_and_release + 10
19 libdispatch.dylib              0x302d95d9 _dispatch_queue_drain$VARIANT$mp + 948
20 libdispatch.dylib              0x302d90a9 _dispatch_queue_invoke$VARIANT$mp + 84
21 libdispatch.dylib              0x302db0d3 _dispatch_root_queue_drain + 330
22 libdispatch.dylib              0x302dc1fb _dispatch_worker_thread3 + 106
23 libsystem_pthread.dylib        0x3044ce25 _pthread_wqthread + 668
还有一个(发生频率较低):


我猜你有

  • 一些
    \uuu不安全\uu未恢复
    (即用于设置器路径
    [NSInvocation setArgument:atIndex:
  • 还是像这样的问题
  • 或(更可能)在执行锁定和等待期间 (因为我在堆栈中看到连接/超时)
以下是一些相关建议:

1)
NSManagedObject
NSManagedObjectContext
nspersistentstorecordinator
(考虑到
addPersistCacheToStorageDaemon
上的崩溃)不是线程安全的:

  • 如果您使用
    performBlockAndWait
    发送消息,请考虑这一点 到您的
    NSManagedObjectContext
    (更多和)或
2)
CFNetwork
是一个较低级别的类,由
NSURLConnection
包装:

  • 所以不使用NSURL
?避免添加观察者:自分叉路径(KVO) 到NSURL会话的属性
    问题实际上可能来自SDWebImage 本网站引述:

    现在,如果您使用AFNetworking直接从URL使用AFNetworking类别设置图像,您可能需要使用替代方法,以便可以干预并调整图像大小。下面的代码将实现这一点

    我还将检查此页面是否存在相关的崩溃:


    检查您是否正在使用最新版本的SDWebImage,否则您可能必须检查旧版本。

    随着iOS 8的推出,也出现了一些意外的错误,我们必须记住这一点

    MIT Mobile、Mile point等应用程序也受到类似于您的问题的困扰,但目前还没有广泛传播

    以下是&的bug链接

    com.apple.CFNetwork.addPersistCacheToStorageDaemon

    CFNetwork是较低级别的C API,它由较高级别的类(如NSURLConnection)包装

    因此,崩溃发生在网络运行期间

    EXC\u坏访问

    这意味着该消息被发送到一个内存地址,而该内存地址中没有类的实例来执行它。因此导致“不良访问”

    什么时候会发生

  • 对象未初始化
  • 已释放一个对象
  • 其他不太可能发生的事情
  • 我们如何解决这个问题

    • 通过在xcode中启用NSZombie,您可以捕获一些bug(第2个)
    启用NSZombie:

    启用此功能后,将在每个已发布对象的位置保留一个虚拟对象(僵尸),从而允许调试已发布的对象。非常容易启用:

  • 双击XCode中“可执行文件”中的可执行文件
  • 打开“要在环境中设置的变量”中的“参数”选项卡(这是底部的列表,请小心编辑哪一个)
  • 单击“+”按钮,为变量名称输入“NSZombieEnabled”,为值输入“YES”
  • 现在,您不必想知道发生了什么,也不必想知道是哪个对象产生了问题,您可以确切地看到哪个类是问题制造者,并且可以很快地调试它

    注: 当您将应用提交到应用商店时,不要让僵尸处于启用状态。此外,如果你真的不需要它们,那么禁用它们也是一种很好的做法

    • 如果您正在使用第三方库,请将其更新为最新版本
    注:

    我的建议是永远不要使用第三方框架,除非这是不可避免的,因为库本身有时会有错误,这是开发人员无法控制的,有时库会更新到当前SDK。您可以找到更多关于它的信息


    希望这能有所帮助

    这是在开发环境中发生的吗?@Zaph:不,我自己无法复制。只在生产中发生。大概
    getData
    被传递了一个伪造的缓冲区地址,但很难猜测是谁负责。请注意,这两种情况都涉及URL缓存的操作。我也经历过同样的崩溃。无法复制Crashlytics报告的内容。它发生在SDWebImage中。我也经常在Crashlytics中看到这种崩溃,但从未能够重现它。该应用程序也使用SDWebImage,但我不确定这是否相关。
    Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon
    0  libsystem_platform.dylib       0x000000019344d300 _platform_memmove + 176
    1  Foundation                     0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172
    2  Foundation                     0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172
    3  Foundation                     0x0000000182e2ae3c -[NSData(NSData) replacementObjectForCoder:] + 160
    4  Foundation                     0x0000000182dbd320 -[NSXPCEncoder _replaceObject:] + 120
    5  Foundation                     0x0000000182e2dac8 -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 256
    6  Foundation                     0x0000000182e2a544 -[NSDictionary(NSDictionary) encodeWithCoder:] + 1016
    7  Foundation                     0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716
    8  Foundation                     0x0000000182dbe2e8 encodeInvocationArguments + 508
    9  Foundation                     0x0000000182dbdee4 -[NSXPCEncoder encodeInvocation:] + 412
    10 Foundation                     0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716
    11 Foundation                     0x0000000182dbcb0c -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 2196
    12 CoreFoundation                 0x0000000181fde230 ___forwarding___ + 440
    13 CoreFoundation                 0x0000000181ee2b6c _CF_forwarding_prep_0 + 92
    14 CFNetwork                      0x000000018199c908 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1976
    15 libdispatch.dylib              0x00000001932793ac _dispatch_call_block_and_release + 24
    16 libdispatch.dylib              0x000000019327936c _dispatch_client_callout + 16
    17 libdispatch.dylib              0x00000001932834c0 _dispatch_queue_drain + 1216
    18 libdispatch.dylib              0x000000019327c474 _dispatch_queue_invoke + 132
    19 libdispatch.dylib              0x0000000193285224 _dispatch_root_queue_drain + 664
    20 libdispatch.dylib              0x000000019328675c _dispatch_worker_thread3 + 108
    21 libsystem_pthread.dylib        0x00000001934552e4 _pthread_wqthread + 816
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:imageURL];
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"];
    
    [imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
        // resize image
        // set image on imageView
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
        // handle error
    }];