“如何解决问题”;EXC“不良访问”;在iOS上,当我们不';t创建正在读取的地址

“如何解决问题”;EXC“不良访问”;在iOS上,当我们不';t创建正在读取的地址,ios,objective-c,Ios,Objective C,我们遇到了一个问题,iOS的一个bug导致我们的应用程序崩溃。这种情况只发生在0.001%的用户身上,但一旦发生,就会导致应用程序无法使用(启动时崩溃) 问题是,根本缺陷存在于苹果的iOS代码中,我们无法直接修复。我们正在寻找解决方法,而不是根本原因修复 崩溃是EXC\u BAD\u ACCESS 我们不创建正在读取的数据地址。我们正在从PHImageManager requestImageDataForAsset获取一个NSData。当我们试图使用NSData.bytes+NSData.le

我们遇到了一个问题,iOS的一个bug导致我们的应用程序崩溃。这种情况只发生在0.001%的用户身上,但一旦发生,就会导致应用程序无法使用(启动时崩溃)

问题是,根本缺陷存在于苹果的iOS代码中,我们无法直接修复。我们正在寻找解决方法,而不是根本原因修复

  • 崩溃是
    EXC\u BAD\u ACCESS
  • 我们不创建正在读取的数据地址。我们正在从PHImageManager requestImageDataForAsset获取一个
    NSData
    。当我们试图使用
    NSData.bytes
    +
    NSData.length
    访问它时,它会在
    EXC\u BAD\u访问时崩溃
    
  • 这是一个真实的内存地址(不是0x00000000),但我们的应用程序不允许访问它。我们从PHImageManager返回的NSData似乎具有无效指针或无效长度
  • 这是非常罕见的。这种情况只发生在0.001%的用户身上,所以这可能是他们图书馆中一张糟糕照片的罕见问题
  • 这不是暂时的。无论是什么原因导致了这种情况,每次应用程序为该用户启动时都会发生这种情况(我们会访问您的相机启动时滚动中的最后12张照片)
问题是我们如何解决这场崩溃。我知道修复根本原因总是最好的,但在这种情况下,根本原因不在我们的代码中(苹果库返回的NSData无效)。我们不知道它是无效的,直到我们尝试访问它,然后就太晚了

我们尝试过(但失败了)的想法:

  • 捕获EXC\u BAD\u访问似乎不可能:
有什么解决方法的想法吗

下面是触发此操作的示例代码。它适用于99.9999%的照片,但失败时会致命。当NSData无效时,如何发现问题

[[PHImageManager defaultManager] requestImageDataForAsset:asset
      options:opts
      resultHandler:^(NSData* imageData, NSString* dataUTI, UIImageOrientation orientation, NSDictionary* info) {
   if (!imageData || imageData.length == 0) {
      return;
   }

   CC_MD5_CTX md5;
   CC_MD5_Init(&md5);
   CC_MD5_Update(&md5, imageData.bytes, (CC_LONG)imageData.length);

   unsigned char digest[CC_MD5_DIGEST_LENGTH];
   CC_MD5_Final(digest, &md5);
}];
事故日志

0   libcorecrypto.dylib md5_compress + 60
1   libcorecrypto.dylib ccdigest_update + 264
2   libcommonCrypto.dylib CC_MD5_Update + 188
... app code above ...

你能展示一下实际的代码吗?还有崩溃日志?@matt添加了代码。仍然不知道哪一行崩溃,或者崩溃日志是什么样子。是否有可能存在一个只有1字节信息的图像?这将导致访问不良。如果您要访问多个字节的信息,我建议您将
If
语句更改为返回If
length您已经从根本上改变了对代码的定义,并且您仍然没有回答有关崩溃的关键问题。对这些事情最好不要害羞。你提供的信息越真实,就越有可能有人能提供帮助。