2015-06-10 7 views
34

W stosie wyjątków powodującym awarie w środowisku wykonawczym, Swift często mówi, że argumenty są martwe lub eksplodowały. Co to znaczy i czy ma znaczenie dla celów debugowania?Co Dead and Exploded w stosie wyjątków Swift?

Na przykład:

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

Dzięki.

+0

Podobne pytanie: http://stackoverflow.com/questions/31397116/what-does-arg-exploded-mean-in-swift-crash-log – JAL

Odpowiedz

55

Co to znaczy?

Kompilator Swift oznacza argumenty funkcji z wielu powodów, związanych głównie z wewnętrznymi optymalizacjami. Na twoje pytanie skoncentrujemy się na manglerze, ponieważ to właśnie przyczynia się do twojego pretty stack trace i drukarki węzła. Począwszy od chwili tego stanowiska, mangler specjalizacja funkcja ma 6 znaków można go zastosować do argumentu:

  • Martwe

    argument jest nieużywany w ciele funkcji i może być usunięta w przepustka eliminująca martwą kłótnię.

  • Zamknięcie

    Argument jest zamknięcie i może wymagać dalszego przekręcona/demangling.

  • Stała

    Argument jest stała.

  • Należący do Gwarantowanych

    dzwoniący własność transfery argumentów własności do odbierającym. Argument ma zatem silne odniesienie z nim związane [wywołującego] i gwarantuje, że przeżyje wywołanie, więc kompilator zezwala wywołującemu na przeniesienie transferu, a zamiast tego zachowuje się agregacja.

  • SROA

    Scalar Replacement of Aggregates wprost powinny zoptymalizować ten argument.

  • Wyjść do wartości

    Parametr cechował inout ale wywoływany w rzeczywistości nie mutować go.

Drukarka Węzeł AST dodaje jeszcze jeden Oznacz

  • rozłożeniu

    Wartość pochodzi ze schematu eksplozja, która została zrealizowana, gdy połączenie zostało wykonane.

Dla wszystkich zamiarów i celów my tylko dbają o Dead, Owned to Guaranteed i Exploded.

Jedynym, który nadal może wydawać się dziwny, jest Exploded. Explosion jest konstruktem optymalizacyjnym używanym przez kompilator Swift do określenia strategii rozpakowywania wartości z małych struktur i wyliczeń do rejestrów. Tak więc, kiedy drukarka węzłowa mówi, że wartość to Exploded, oznacza to, że już rozpakowała ją do rejestrów przed wywołaniem.

ma znaczenie dla celów debugowania?

Nie.

+2

Świetna informacja. Gdzie się o tym dowiedziałeś? – jtbandes

+4

Hopper, Joe Groff, Intuicja. – CodaFi

+0

Dziękujemy za szczegółową odpowiedź! Warto również zauważyć, że "funkcja specjalizacji podpisów" oznacza, że ​​wystąpił problem z interfejsami API Swift, w których Objective-C musiał przekazać wartość parametru zerowego do Swift, ale wersja Swift tego parametru nie została wpisana jako opcja (http: //stackoverflow.com/a/31141957/2415822). – JAL

0

Na podstawie tego, co udało mi się znaleźć w bibliotece deweloperów Apple, uważam, że gdy Swift twierdzi, że argument jest eksplodowany, został rozszerzony tak, aby pokazywał błąd, dopóki nie pokaże wszystkich warstw i części argumentu. Swift robi to, aby ułatwić znajdowanie błędów zagnieżdżonych między warstwami argumentu. Nie jestem pewien, co znaczy martwy. Może to być zupełnie nie na miejscu, ale sądzę, że skoro nie otrzymałeś odpowiedzi w ciągu 6 dni, równie dobrze mógłbym spróbować wyjaśnić, że masz problem.

0

Martwe zwykle oznacza, że ​​wartość nie jest już w pamięci

Nie wiem, jak to się dzieje, aby pomóc, chyba że naprawdę będzie zanurzyć się debugowania montaż jest.

Możesz chcieć sprawdzić niektóre zasoby online, np. Jak korzystać z debuggera w Xcode, aby rozwiązać problemy z kodem.