2017-03-16 5 views
0

Ich versuche gerade, schnell zu lernen, und während ich etwas Dummy-Zeug schrieb, bemerkte ich, dass der xcode einige Zeilen überspringt und manchmal auf merkwürdigen Linien stoppt. mein env: macos sierra, Xcode Version 8.2.1 (8C1002)Warum überspringt lldb diese Zeile?

da Xcode einige Zeilen überspringt, dachte ich, das Problem von Code-Optimierung ist, dann wechselte ich zu debuggen zum Terminal, unterhalb der Eingang & Ausgang ist

I zusammengestellt

swiftc -g -Onone *.swift 

dann

Last mit LLDB mit

lldb main 

Satz Haltepunkt auf Flusen 18, wie unten und Prozess ausgeführt mit „r“

17 do { 
-> 18  try StaticM.teststatic2() 
    19  print (1) 
    20 }catch { 
    21  
(lldb) thread step-in 
Process 963 stopped 
* thread #1: tid = 0x86e1, 0x0000000100001f6a main`static StaticM.teststatic2(self=main.StaticM, $error=Error @ 0x00007fff5fbffac0) throws ->() + 26 at staticExt.swift:13, queue = 'com.apple.main-thread', stop reason = step in 
    frame #0: 0x0000000100001f6a main`static StaticM.teststatic2(self=main.StaticM, $error=Error @ 0x00007fff5fbffac0) throws ->() + 26 at staticExt.swift:13 
    10 public extension StaticM { 
    11  @discardableResult 
    12  public static func teststatic2() throws { 
-> 13   var asdf=2; 
    14   let sdfgsdfg=2; 
    15   print(sdfgsdfg); 
    16   print (asdf); 
(lldb) n 
Process 963 stopped 
* thread #1: tid = 0x86e1, 0x0000000100001f72 main`static StaticM.teststatic2(self=main.StaticM, $error=Error @ 0x00007fff5fbffac0) throws ->() + 34 at staticExt.swift:15, queue = 'com.apple.main-thread', stop reason = step over 
    frame #0: 0x0000000100001f72 main`static StaticM.teststatic2(self=main.StaticM, $error=Error @ 0x00007fff5fbffac0) throws ->() + 34 at staticExt.swift:15 
    12  public static func teststatic2() throws { 
    13   var asdf=2; 
    14   let sdfgsdfg=2; 
-> 15   print(sdfgsdfg); 
    16   print (asdf); 
    17   asdf += 1; 
    18  } 
(lldb) process continue 
Process 963 resuming 
2 
2 
1 
Process 963 exited with status = 0 (0x00000000) 
(lldb) 

gezeigt Frage, nachdem ich zur nächsten Zeile unter Verwendung von „n“ in LLDB gehen, warum LLDB überspringt 14 von staticExt.swift Leitung und springt direkt auf Linie 15?

auch, manchmal beim Versuch, ein anderes Programm zu debuggen, klicke ich auf "step-in" in xcode, es stoppt auf der Deklarationszeile des func statt der ersten Zeile im Codeblock, ich klickte Stepover, es geht zurück in die Caller-Func-Zeile, anstatt die erste Zeile dieser Funktion auszuführen.

in allem, programme funktioniert, aber warum lldb springt sogar mit -Onone und -g? können Sie bitte lassen Sie mich wo finde ich weitere Informationen? vielen Dank.

Antwort

0

Swift Grundtypen (Int sind, Strings, etc.) sind formal etwas schwergewichtige - zum Beispiel in Ihrem Beispiel:

(lldb) expr --raw -- asdf 
(Swift.Int) $R0 = { 
    _value = 3 
} 

Um die Leistung akzeptabel zu machen, auch wenn dies wahr ist, der schnelle Compiler „unboxes "Diese Typen verwenden häufig Operationen und wenden andere" optimierungsähnliche "Tricks an, um das Ganze schneller zu machen. Da dies ein allgegenwärtiges Merkmal von swift ist, macht es sogar bei -Onone, die Leistung von nicht optimiertem Code akzeptabel zu machen. Und sobald der Optimierer sich einmischt, kann er sich manchmal nicht helfen und wird mehr Arbeit leisten, als es vielleicht bei -Onone tun sollte.

In diesem Fall, weil die erste Variable ein "let" eines Int ist, weiß swiftc, dass es den Wert direkt in die Argumente einfügen kann, wenn es zum Aufruf von print geht, also muss es kein a bilden Variable. Wenn Sie die let in eine var ändern, wird Code für diese Zeile tatsächlich generiert, und die Zeile erhält einen eigenen Zeilen-Tabelleneintrag.

Wenn Sie wissen, wie man Assemblercode liest, können Sie sich die gemischte Disassemblierung ansehen, um dies in Aktion zu sehen.

In LLDB:

(lldb) dis -m -f 

Sie mischten die Demontage des aktuellen Rahmens geben.

+0

Danke Jim.That wirklich hilft .kann ich annehmen, dass swiftc macht auch ein paar andere Tricks, wie ich einige andere seltsame Dinge erlebt, wie es nicht auf der ersten Zeile in der Func-Block stoppen, stattdessen bricht es auf Funcline erklären? Wo finde ich was macht swiftc? Danke – user3299264

+0

Das scheint wahrscheinlich.Es gibt keinen einzigen Ort, an dem das Verhalten des Optimierers bei -Onone beschrieben wird, und der "Optimierer" ist sowieso keine Einheit, es ist eine Reihe separater Pässe, die jeweils versuchen, ihre eigenen Aufgaben zu erledigen. Sie können die "Linientabelle" sehen, die in den Debug-Informationen mit dem lldb-Befehl 'image dump linientabelle MySource.swift' enthalten war, aber das sagt Ihnen nur, welche Informationen der Debugger hat, nicht warum der Swift-Compiler entschieden hat, ihn zu umrahmen dieser Weg. –

Verwandte Themen