Подтвердить что ты не робот

Что такое Dead & Explode в стеке стека Swift?

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

Например:

-> 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

Спасибо.

4b9b3361

Ответ 1

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

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

  • мертв

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

  • закрытие

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

  • постоянная

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

  • Принадлежит к Гарантированному

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

  • SROA

    Скалярная замена прохода агрегатов должна оптимизировать этот аргумент.

  • В Out To Value

    Параметр был отмечен как inout, но вызываемый объект на самом деле не изменяет его.

AST Node Printer добавляет еще одну марку

  • взорванный

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

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

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

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

Нету.

Ответ 2

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

Ответ 3

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

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

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