Сбой на некоторых устройствах при использовании GCD - PullRequest
0 голосов
/ 01 марта 2012

У меня есть приложение iOS, которое вылетает на нескольких устройствах.Учитывая плохие отзывы, которые я вижу в iTunes, когда это происходит, сбои происходят в той же точке кода.

Наконец, один приятный человек связался со мной, вместо того, чтобы просто оставить отзыв, и онидаже когда я установил отладочную версию приложения, используя TestFlight для меня.

Вооружившись отчетом о сбое, я вижу, что это происходит где-то глубоко в malloc:

2 libSystem.B.dylib 0x34683d6e _sigtramp + 42
3 libSystem.B.dylib 0x3468c886 szone_malloc_should_clear + 2122

Иучитывая номер строки, это происходит в тот момент, когда я запускаю фоновую задачу:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    UIImage *image = [self loadImage:path];
    dispatch_sync(dispatch_get_main_queue(), ^{

Я не уверен, на какой из этих трех строк происходит сбой, поэтому неясно, является ли сбойпроисходит при вызове самого GCD, прямо в начале кода блока или где-то в самом блоке.

Трассировка стека заканчивается в функции, которая включает фрагмент кода выше, а не, казалось бы,в самом блоке.Если сбой произошел в асинхронном блоке, будет ли трассировка стека по-прежнему включать дерево вызовов в родительскую функцию?В настоящее время я работаю в предположении, что трассировка стека для сбоя внутри блока не будет включать вызов родительской функции (так как блок выполняется асинхронно в своем собственном потоке), поэтому я думаю, что это сбой вызова GCD.

Я пытался использовать TFLog, чтобы найти точный момент сбоя, но журналы вообще не записываются.Я знаю, что вызовы журнала выполняются правильно, поскольку на моем устройстве разработки я вижу всплывающие журналы в рекордере TestFlight, поэтому кажется, что сбой нарушает этот параметр отладки.

Наконец, TestFlight не может найтиНомер версии iOS для iPhone 4, который использует этот пользователь - так что мне интересно, это устройство с джейлбрейком, и может ли это иметь эффект?(Я спросил пользователя, ответа пока нет).

Обратите внимание, что это весь код ARC, поэтому я был бы очень удивлен, обнаружив, что это проблема управления памятью.Он также изолирован от нескольких устройств, но эти устройства каждый раз дают сбой в один и тот же момент.

Может кто-нибудь предложить какие-либо идеи или предложения по отладке (учитывая, что у меня нет самопроизвольного сбоя устройства).

Спасибо,

Тим

1 Ответ

0 голосов
/ 02 марта 2012

Я решил эту ужасную ошибку.

Оказывается, DISPATCH_QUEUE_PRIORITY_BACKGROUND доступен только в 5.0 или более поздних версиях и будет зависать в предыдущих версиях.iPhone 3G под управлением 4.2.1, но поскольку эта модель вообще не поддерживает GCD, этот конкретный путь к коду не запускался ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...