«Плохой системный вызов: 12» аварийно завершает работу при использовании статической платформы на iOS с IPA-развертыванием (не запуск Xcode) - PullRequest
2 голосов
/ 28 марта 2012

Я работаю с созданным мной статическим фреймворком (созданным с помощью набора инструментов iOS-Universal-Framework Карла Стенеруда), который я собираюсь распространять.Статический фреймворк немного удобнее, чем просто использование статических заголовков lib + - мне нравится возможность просто вставить фреймворк и сразу начать его использовать, вместо того, чтобы делать что-то вроде установки соответствующих путей поиска заголовков.

Однако я вижу какое-то странное поведение.Несколько тестовых / примеров приложений, которые я создал с помощью этой инфраструктуры, аварийно завершают работу с « Плохой системный вызов: 12 » или « Задание, похоже, аварийно завершилось: недопустимая инструкция: 4 » при запускена устройствах iOS, на которых приложение было развернуто через ipa .

Сам код в порядке.Сбой не происходит, когда вместо фреймворка используется статическая библиотека.Также не происходит сбой, если приложение развернуто через отладчик в XCode, даже когда используется конфигурация выпуска сборки.

Сбой только происходит при развертывании через ipa и когдабиблиотека связана как статическая структура.

Интересно, что соответствующие записи трассировки стека в журнале аварий, ведущие к аварии (EXC_CRASH или EXC_BAD_INSTRUCTION), не могут быть символизированы.

В одном случаеМне удалось отследить падение до точки, где вызывается статическая функция C.Удалив ключевое слово «static» по прихоти, я смог остановить сбой.

К сожалению, это не серебряная пуля - я также вижу сбой настатический вызов функции C.

Но во всех случаях происходит сбой при вызове функции C.

Итак, мой вопрос таков: кто-нибудь еще видел это раньше?Есть теории?Это может быть ошибка LLVM?Какой-то волшебный флаг компилятора / компоновщика мне не хватает?Есть ли у Apple намеренно только половина поддерживаемых статических платформ, потому что есть проблемы?Нужно ли мне просто отказаться от своего плана распространения фреймворка вместо статической библиотеки и различного детрита?

Заранее большое спасибо,

Майкл

Ответы [ 2 ]

1 голос
/ 20 апреля 2012

Возможно, проблема связана со статическими рекурсивными функциями!

Цитируя Карла Стенеруда, который понял это:

Сбой, если у вас есть статическая рекурсивная функция:

@implementation Fibonacci

static int internalFibonacci(int value)
{
    if(value <= 1)
    {
        return value;
    }
    return internalFibonacci(value - 1) + internalFibonacci(value - 2);
}

+ (int) fibonacci:(int) value
{
    return internalFibonacci(value);
}

@end

Если вы позвоните [Fibonacci fibonacci:], то произойдет сбой с сообщением «Неверный системный вызов: 12».

Если вы удалите «static» из internalFibonacci (), он будет отлично работать.

0 голосов
/ 20 апреля 2012

Я уже сталкивался с подобными проблемами. Я разрабатываю фреймворки iOS для компании, и мы предоставляем эти фреймворки клиентам, которые разрабатывают свои собственные приложения или фреймворки выше наших.

Когда мы проводим тестирование самостоятельно, кажется, что все работает нормально, а приложения просто работают отлично. Но как только приложения / фреймворки создаются с использованием другой версии XCode / Compiler, нет никакой гарантии, что все будет работать так, как ожидалось. В сообщениях о сбоях, о которых нам сообщали клиенты, всегда упоминается плохое выполнение кода или плохая инструкция (так же, как и вы).

Мы много искали на форумах разработчиков Apple, но мало упомянули об этой проблеме, и Apple, похоже, не хочет об этом сообщать.

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

  • Создайте свой фреймворк на Xcode 4.1, iOS SDK 4.3 и Apple LLVM 2.1
  • на OS X Lion, Xcode 4.3 вы можете собрать с помощью LLVM GCC и обязательно отключите поддержку THUMB в настройках вашей сборки.

Вы можете попробовать последнее решение. Я провел много тестов со всеми возможными компиляторами на OS X Lion, и до сих пор эта конфигурация выглядит стабильной. Я еще не тестировал новый Xcode 4.3.2 и iOS SDK 5.1. Я дам вам знать, как только я это сделаю.

С уважением,

Hichem

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