Как обойти «EXC_BAD_ACCESS» на iOS, когда мы не создаем адрес для чтения - PullRequest
0 голосов
/ 04 февраля 2019

У нас есть проблема, из-за которой ошибка iOS приводит к сбою нашего приложения.Это произошло только для 0,001% пользователей, но когда это происходит, приложение становится непригодным для использования (сбой при запуске).

Проблема в том, что основная ошибка в коде iOS Apple, а не то, что мы можем исправить напрямую.Мы ищем помощь в поиске обходного пути, а не в устранении основной причины.

  • Сбой EXC_BAD_ACCESS.
  • Мы не создаем адрес данных для чтения.Мы получаем NSData от PHImageManager requestImageDataForAsset.Когда мы пытаемся получить к нему доступ с помощью NSData.bytes + NSData.length, происходит сбой с EXC_BAD_ACCESS.
  • Это реальный адрес памяти (не 0x00000000), но наше приложение не имеет доступа к нему.Похоже, что NSData, который мы получаем от PHImageManager, имеет неверный указатель или неверную длину.
  • Это очень необычно.Это происходит только у 0,001% пользователей, поэтому, скорее всего, это редкая проблема из-за одной плохой фотографии в их библиотеке.
  • Это не преходяще.Независимо от того, что плохая фотография вызывает это, это происходит каждый раз, когда приложение запускается для этого пользователя (у нас есть доступ к последним 12 фотографиям в вашей фотопленке при запуске).

Вопрос в том, как можномы обходим это крушение .Я знаю, что всегда лучше исправить основную причину, но в этом случае основная причина не в нашем коде (NSData, возвращенный библиотекой яблока, недопустим).Мы не знаем, что он недействителен, пока не попытаемся получить к нему доступ, и тогда будет слишком поздно.

Идеи, которые мы пытались (и не удалось):

Любые идеи для обходного пути ?

Вот пример кодаэто вызовет это.Это работает для 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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...