2015-06-10 2 views
34

В стеке исключений для сбоев во время работы Swift часто говорит, что аргументы Dead или Exploded. Что это значит и имеет ли это значение для целей отладки?Что такое Dead & Exploded в стеке исключений Swift?

Например:

-> 0x100209cf0 <function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) ->()+44>: brk #0x1 

Спасибо.

+0

Аналогичный вопрос: http://stackoverflow.com/questions/31397116/what-does-arg-exploded-mean-in-swift-crash-log – JAL

ответ

55

Что это значит?

Компилятор Swift отмечает аргументы функции по ряду причин, в основном связанных с внутренней оптимизацией. По вашему вопросу мы сосредоточимся на mangler, так как это способствует вашему pretty stack trace и принтеру узла. По состоянию на время этого поста, функция специализация Mangler имеет 6 знаков он может обратиться к аргументу:

  • Мертвый

    Аргумент не используется в теле функции и может быть удален в удаление мертвого аргумента.

  • Закрытие

    Аргумент является закрытие и может потребовать дальнейшего коверкание/декодировании.

  • Константа

    Аргумент является константой.

  • Принадлежит к Гарантированный

    вызывающего абонента, принадлежащего аргумент передает права собственности на вызываемым. Таким образом, аргумент имеет сильную ссылку, связанную с ним [вызывающего абонента], и, как гарантируется, он может прожить через вызов, поэтому компилятор позволяет вызывающему абоненту преодолеть передачу, а совокупность сохраняется.

  • SROA

    Scalar Replacement of Aggregates проход должен оптимизировать этот аргумент.

  • Ушло Для Цените

    Параметр был отмечен INOUT, но вызываемая фактически не мутировать его.

Узел Принтер AST добавляет еще одну марку

  • разобранном

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

Для всех намерений и целей, мы только заботимся о Dead, Owned to Guaranteed и Exploded.

Единственный, который все еще может показаться мистическим, - Exploded. Explosion - это оптимизационная конструкция, используемая компилятором Swift для определения стратегии для распаковки значений из небольших структур и перечислений в регистры. Таким образом, когда принтер узла говорит, что значение равно Exploded, что означает, что он уже распаковал значение в регистры перед вызовом.

имеет значение для целей отладки?

Nope.

+2

Отличная информация. Откуда вы узнали обо всем этом? – jtbandes

+4

Хоппер, Джо Грофф, Интуиция. – CodaFi

+0

Благодарим вас за подробный ответ! Также стоит отметить, что «специализация подписи функций» означает, что возникла проблема с API-интерфейсами Swift, где Objective-C необходимо передать значение параметра nil в Swift, но версия Swift этого параметра не была введена в качестве опции (http: //stackoverflow.com/a/31141957/2415822). – JAL

0

Основываясь на том, что я смог найти в библиотеке разработчиков Apple, я считаю, что когда Swift говорит, что аргумент взорван, он был расширен, чтобы показать ошибку до тех пор, пока она не покажет все слои и части аргумента. Swift делает это, чтобы облегчить поиск ошибок, которые вложены между уровнями аргумента. Я не уверен, что значит мертвый. Это может быть совершенно несовместимо, но я полагаю, что, поскольку вы не получили ответа через 6 дней, я мог бы попробовать и уточнить, что вы проблема.

0

Мертвой обычно означает, что значение больше не находится в памяти

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

Возможно, вы захотите проверить некоторые онлайн-ресурсы, то есть как использовать отладчик в Xcode для устранения неполадок с вашим кодом.

Смежные вопросы