Wie symbolisiere ich das Crash Log Xcode?


188

Der Xcode 5-Organizer hatte eine Ansicht, in der alle Absturzprotokolle aufgelistet waren. und wir könnten Drop-Crash-Protokolle hierher ziehen. Aber seit Xcode 6 weiß ich, dass sie Geräte aus der Organisation verschoben haben und ein neues Fenster dafür haben. Aber ich finde keinen Ort, an dem ich die Absturzprotokolle ansehe, die ich in Xcode 5 gezogen habe, nachdem ich auf Xcode 6 erhöht habe. Kennt jemand die Antwort?


3
Ich habe vor Monaten in den Apple-Entwicklerforen nachgefragt und keine Antwort erhalten. Dies ist ein Verlust nützlicher Funktionen. Reichen Sie einen Fehlerbericht bei Apple ein, um diese Funktion wieder zu erhalten.
rmaddy

1
Ich habe dies über ein Wochenende zusammengeschlagen, um die Symbolisierung für iOS- und OSX-Crash-Dumps zu lösen. Es ist immer noch sehr rau, aber es sollte funktionieren. github.com/agentsim/Symbolicator
Tim

4
Xcode, können Sie bitte nur symbolische Absturzprotokolle von Apple-Rezensenten finden, wie Sie es sollten ... anstatt davon auszugehen, dass wir buchstäblich den ganzen Tag Zeit haben, um herauszufinden, wie das geht?
William Entriken

Antworten:


119

Ok, mir wurde klar, dass du das kannst:

  1. In Xcode > Window > DevicesWählen Sie einen angeschlossenen iPhone / iPad / etc links oben.
  2. Geräteprotokolle anzeigen
  3. Alle Protokolle

Sie haben dort wahrscheinlich viele Protokolle, und um das spätere Auffinden Ihres importierten Protokolls zu vereinfachen, können Sie an dieser Stelle einfach alle Protokolle löschen ... es sei denn, sie bedeuten Ihnen Geld. Oder es sei denn, Sie wissen genau, wann der Absturz passiert ist - er sollte trotzdem in die Datei geschrieben werden ... Ich bin faul, also lösche ich einfach alle alten Protokolle (dies hat tatsächlich eine Weile gedauert).

  1. Ziehen Sie Ihre Datei einfach per Drag & Drop in diese Liste. Es hat bei mir funktioniert.

13
Ich habe das gleiche Problem, aber das Problem wird dadurch nicht behoben. Protokolle, die ich per Drag & Drop in das Fenster ziehe, werden angezeigt, aber nicht symbolisiert.
Arkaaito

9
Der Trick besteht darin, dass Sie ein Gerät anschließen und das Gerät aus der Liste auswählen müssen. Ich denke nicht, dass es ohne ein Gerät möglich ist.
Jonny

59
Damit Ihre Absturzdatei in diese Liste gezogen werden kann, sollte sie die Erweiterung haben .crash.
pjay_

7
Der fehlende Schritt für mich war, nachdem die Datei gelöscht wurde, ich musste mit der rechten Maustaste auf die Datei klicken und das Protokoll erneut symbolisieren
RobCroll

6
Vergessen Sie nicht, "dSYMs" für dieses Archiv in Organizer herunterzuladen.
123FLO321

259

Schreiben Sie diese Antwort sowohl für die Community als auch für mich.

Wenn es jemals Probleme gibt, die einen Absturzbericht symbolisieren, können Sie diese wie folgt beheben:

  1. Erstellen Sie einen separaten Ordner, kopieren Sie Foo.appund Foo.app.dSYMaus dem entsprechenden .xcarchivein den Ordner. Kopieren Sie den .crashBericht auch in den Ordner.

  2. Öffnen Sie den Absturzbericht in TextEdit oder anderswo, gehen Sie zum Binary Images:Abschnitt und kopieren Sie dort die erste Adresse (z0xd7000 . ).

  3. cdin den Ordner. Jetzt können Sie den folgenden Befehl ausführen:

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

Dies symbolisiert das Symbol an der Adresse 0x0033f9bb. Bitte stellen Sie sicher, dass Sie den richtigen Wert für die -archOption auswählen (kann aus der ersten Zeile in der abgerufen werdenBinary Images: Abschnitts oderHardware Model: und in den von der App unterstützten Bögen ermittelt werden).

Sie können auch die erforderlichen Adressen (z. B. einen Thread-Aufrufstapel) aus dem Absturzbericht direkt in eine Textdatei kopieren (in TextEdit Option gedrückt halten und den erforderlichen Textblock auswählen oder kopieren und ausschneiden), um Folgendes zu erhalten:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

Jetzt können Sie dies in einer Textdatei speichern, z addr.txt und den folgenden Befehl ausführen:

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

Dies gibt eine schöne Symbolisierung für alle Adressen gleichzeitig.

PS

Bevor Sie dies tun, sollten Sie überprüfen, ob alles korrekt eingerichtet ist (as atos gerne etwas für praktisch jede angegebene Adresse melden).

Öffnen Sie zur Überprüfung den Absturzbericht und gehen Sie zum Ende des Aufrufstapels für Thread 0. Die erste Zeile vom Ende, um Ihre App aufzulisten (normalerweise die zweite), z.

34  Foo                    0x0033f9bb 0xd7000 + 2525627

sollte der main()Anruf sein. Das Symbolisieren der Adresse ( 0x0033f9bbin diesem Fall) wie oben beschrieben sollte bestätigen, dass dies tatsächlich main()eine zufällige Methode oder Funktion ist und nicht.

Wenn die Adresse nicht die von ist main(), überprüfen Sie Ihre Ladeadresse ( -lOption) und Ihren Bogen ( -archOption).

PPS

Wenn das oben genannte aufgrund von Bitcode nicht funktioniert , laden Sie das dSYM für Ihren Build von iTunes Connect herunter, extrahieren Sie die ausführbare Binärdatei aus dem dSYM (Finder> Paketinhalt anzeigen), kopieren Sie sie in das Verzeichnis und verwenden Sie sie (dh Foo) als Argument zu atos, anstelle der Foo.app/Foo.


2
Vielen Dank für die Mühe, das Mini-Xcrun-Tutorial zu schreiben und es mit dem Abschnitt zur Überprüfung der Gesundheit zu aktualisieren. Meine
geistige Gesundheit

10
Vergessen Sie nicht zu überprüfen, ob der Absturzbericht mit der ausführbaren Datei und dSYM übereinstimmt. Sie können dies überprüfen, indem Sie die Kennung in den <> unter dem Abschnitt "Binäres Bild" mit der aus Ihrer ausführbaren Datei zurückgegebenen Kennung abgleichen, indem Siexcrun dwarfdump --uuid <path to executable>
Ryan C. Payne

2
Es ist wichtig zu beachten, dass nur Symbole aus Ihrer App (Foo) angezeigt werden. Es wird nicht für Symbole aus externen Bibliotheken / Frameworks wie Foundation oder libsystem_kernel.dylib angezeigt.
Jlukanta

1
Das ist hilfreich, funktioniert aber bei mir immer noch nicht. Der Teil, mit dem ich Probleme habe, ist, dass ich keine 0xd7000-Informationen habe. Meine Zeile sieht so aus 0x100038328 __mh_execute_header + 99112. Ich habe gelesen, was __mh_execute_header ist, aber wie kann ich Informationen über 0x100038328 erhalten? Ich habe alles andere
Skinsfan00atg

5
Ich habe ein einfaches Bash-Skript geschrieben, das den größten Teil der Arbeit für Sie erledigt. Verwendung: ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash Nur es symbolisiert den vollständigen Absturzbericht und gibt Ihnen die symbolisierte Version davon. gist.github.com/nathan-fiscaletti/…
Nathan F.

185

Sie können auch auf diese verweisen, ich habe Schritt für Schritt Verfahren von geschrieben Anleitung manuellen Crash-Re-Symbolisierung geschrieben.

Absturz-Re-Symbolisierung

SCHRITT 1

Verschieben Sie alle oben genannten Dateien (MyApp.app, MyApp-dSYM.dSYM und MyApp-Crash-log.crash) in einen Ordner mit einem geeigneten Namen, wo immer Sie Terminal problemlos verwenden können.

Für mich ist Desktop der am leichtesten erreichbare Ort;) Also habe ich diese drei Dateien in einen Ordner MyApp at Desktop verschoben.

SCHRITT 2

Jetzt ist Finder an der Reihe. Wechseln Sie zu dem Pfad, der für Ihre XCODE-Version gilt.

Verwenden Sie diesen Befehl, um die symbolicatecrashSkriptdatei zu finden .
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8, Xcode 9, Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Senken Sie dann Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Oder Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

SCHRITT 3

Fügen Sie das Verzeichnis der gefundenen symbolicatecrash-Skriptdatei wie $PATHfolgt zur env-Variablen hinzu: Fügen Sie das Verzeichnis sudo vim /etc/paths.d/Xcode-symbolicatecrashder Skriptdatei ein und speichern Sie die Datei. Wenn Sie ein neues Terminal öffnen, können Sie anrufensymbolicatecrash beliebigen Ordner als Befehle in/usr/bin .

Oder

Kopieren Sie die symbolicatecrash-Datei von diesem Speicherort und fügen Sie sie in den Desktop / MyApp ein (Warten Sie ... Folgen Sie mir nicht blindlings. Ich füge die sybolicatecrash-Datei in den Ordner MyApp ein, den Sie in Schritt 1 an Ihrem bevorzugten Speicherort erstellt haben und der drei Dateien enthält. )

SCHRITT 4

Öffnen Sie das Terminal und legen Sie die CD in den MyApp-Ordner.

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 -  Drücken Sie die Eingabetaste

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 -  Drücken Sie die Eingabetaste

Das ist es !! Symbolisierte Protokolle befinden sich auf Ihrem Terminal. Worauf warten Sie jetzt noch? Finden Sie jetzt einfach den Fehler heraus und beheben Sie ihn;)

Viel Spaß beim Codieren !!!


2
@ EmilVikström: Danke für den Vorschlag, habe die Antwort aktualisiert.
Mrug

2
Verwenden Sie export DEVELOPER_DIR =xcode-select --print-path
Parag Bafna

8
Arbeitete ein Vergnügen - danke. Nur eine Sache musste ich exportieren DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (ohne Anführungszeichen).
Goelectric

1
"export DEVELOPER_DIR = xcode-select --print-path" sagt mir nur "-bash: export:` --print-path ': keine gültige Kennung
Almo

2
aktualisieren; hier ist es ; für xcode7 finden Sie hier symbolicatecrash; /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash.com / 32804611 /…
AnneTheAgile

27

Für mich war die .crash-Datei genug. Ohne .dSYM-Datei und .app-Datei.

Ich habe diese beiden Befehle auf dem Mac ausgeführt, auf dem ich das Archiv erstellt habe, und es hat funktioniert:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash

Beeindruckend. Ich weiß nicht, wie das ohne die .dsym-Datei funktioniert, aber es funktioniert!
Rusty Magnet

4
@rustyMagnet Die Funktionsweise besteht darin, dsyms aus den archivierten Builds auf Ihrem Computer zu verwenden.
Andrey Tarantsov

1
Ja, dies funktioniert nur für Builds, die Sie mit Xcode archiviert haben, nicht für andere Builds, die Sie möglicherweise für Ad-hoc-Läufe generiert haben, für die Sie dann Absturzprotokolle symbolisieren möchten.
CMash

21

Es gibt eine einfachere Möglichkeit, Xcode zu verwenden (ohne Befehlszeilentools zu verwenden und Adressen einzeln nachzuschlagen).

  1. Nehmen Sie eine beliebige .xcarchive-Datei. Wenn Sie eine von zuvor haben, können Sie diese verwenden. Wenn Sie noch keine haben, erstellen Sie eine, indem Sie Produkt> Archiv von Xcode aus ausführen.

  2. Klicken Sie mit der rechten Maustaste auf die .xcarchive-Datei und wählen Sie "Paketinhalt anzeigen".

  3. Kopieren Sie die dsym-Datei (der Version der App, die abgestürzt ist) in den Ordner dSYMs

  4. Kopieren Sie die AP-Datei (der abgestürzten Version der App) in den Ordner Produkte> Anwendungen

  5. Bearbeiten Sie die Info.plist und den CFBundleShortVersionString und die CFBundleVersion im ApplicationProperties-Wörterbuch. Auf diese Weise können Sie das Archiv später identifizieren

  6. Doppelklicken Sie auf das .xcarchive, um es in Xcode zu importieren. Es sollte Organizer öffnen.

  7. Gehen Sie zurück zum Absturzprotokoll (im Gerätefenster in Xcode).

  8. Ziehen Sie Ihre .crash-Datei dorthin (falls nicht bereits vorhanden).

  9. Das gesamte Absturzprotokoll sollte jetzt symbolisiert werden. Wenn nicht, klicken Sie mit der rechten Maustaste und wählen Sie "Absturzprotokoll erneut symbolisieren".


1
Ihre Antwort ist richtig und einfach. Die Terminal-App muss nicht verwendet werden. Die Neuerstellung des .xcarchive-Ordners ist sehr wichtig, da in einigen Continuous-Integration-Systemen keine .xcarchive-Datei anstelle des Zip-Balls des .app.dSYM-Ordners vorhanden ist. Zufällig ist das, was ich gestern getan habe, genau das gleiche, wie Sie gesagt haben.
DawnSong

Wie soll die volle Ausgabe aussehen?
Noobsmcgoobs

Dies symbolisiert teilweise meine Absturzprotokolle, obwohl ich Schritt 3-5 übersprungen habe, da mein xcarchive für die Version der App ist, die abgestürzt ist.
Declan McKenna

1
Es wird natürlich nur Ihren eigenen Code symbolisieren - nicht den externen Bibliothekscode, den Sie möglicherweise verwendet haben.
RPM

7

Führen Sie die folgenden Schritte in Xcode 10 aus, um ein Absturzprotokoll einer App zu symbolisieren, die auf demselben Computer erstellt wurde:

  1. Suchen Sie in Organizer das Archiv, auf dem die App basiert.
  2. Klicken Sie auf die Schaltfläche Debug-Symbole herunterladen . In Ihrem Download-Ordner wird nichts angezeigt, aber das ist in Ordnung.
  3. Verbinden Sie den Build-Computer mit einem iOS-Gerät.
  4. Wählen Sie das Gerät unter Geräte und Simulatoren aus .
  5. Klicken Sie auf die Schaltfläche Geräteprotokolle anzeigen.
  6. Ziehen Sie die Absturzdatei per Drag & Drop in das linke Fenster. Die Datei muss mit der Erweiterung .crash enden , andernfalls schlägt das Ziehen fehl.
  7. Wechseln Sie zur Registerkarte Alle Protokolle .
  8. Wählen Sie die hinzugefügte Absturzdatei aus.
  9. Die Datei sollte automatisch symbolisieren, andernfalls verwenden Sie den Kontextmenüpunkt Kontextprotokoll erneut symbolisieren .

Zuerst dachte ich nicht, dass dies anderen Posts etwas hinzufügt, aber die ersten beiden Schritte, insbesondere die 'Download Debug Symbole', scheinen das zu sein, was mir gefehlt hat. Danke dir.
Christopher King

6

Wenn Sie die .dSYM- und die .crash-Datei im selben Unterordner haben, können Sie folgende Schritte ausführen:

  1. Beachten Sie beim Zurückverfolgen in der .crash-Datei den Namen des Binärbilds in der zweiten Spalte und die Adresse in der dritten Spalte (z. B. 0x00000001000effdc im folgenden Beispiel).
  2. Notieren Sie sich direkt unter der Rückverfolgung im Abschnitt "Binärbilder" den Bildnamen, die Architektur (z. B. arm64) und die Ladeadresse (0x1000e4000 im folgenden Beispiel) des Binärbilds (z. B. TheElements).
  3. Führen Sie Folgendes aus:

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

Autorisierende Quelle: https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS


3

Stellen Sie sicher, dass der Name Ihrer Xcode-Anwendung keine Leerzeichen enthält. Dies war der Grund, warum es bei mir nicht funktioniert hat. Funktioniert also, /Applications/Xcode.appfunktioniert /Applications/Xcode 6.1.1.appaber nicht.


Hast du es versucht? Wenn nicht, versuchen Sie bitte zu prüfen, ob Ihr Kommentar sinnvoll ist.
Bouke

1
Das ist nicht das gleiche Problem, von dem ich spreche. Xcode kann nach der Installation, jedoch vor der ersten Verwendung umbenannt werden. Das Skript zur Symbolisierung kann jedoch keine Leerzeichen im Namen der Anwendung verarbeiten und schlägt fehl.
Bouke

1
@ChuckKrutsinger Hast du es tatsächlich versucht? Mit Escapezeichen können Sie das Skript ausführen, das Skript selbst schlägt jedoch fehl. Das Skript ruft wahrscheinlich keine anderen Skripte mit dem maskierten Leerzeichen auf.
Bouke

1
@ChuckKrutsinger Das ist sehr schön und alles, aber wenn man möchte, dass Xcode automatisch das Absturzprotokoll symbolisiert, braucht man am Ende meine Antwort.
Bouke

1
Ich möchte noch einmal betonen, dass Bouke korrekt ist und dass das Skript, mit dem Xcode Absturzprotokolle erneut symbolisiert, NICHT funktioniert, wenn Sie einen Platz im Pfad für die Xcode-App haben. Nichts mit manueller Re-Symbolisierung zu tun.
Gary Makin

3

Xcode 11.2.1, Dezember 2019

Apple gibt Ihnen ein Absturzprotokoll im TXT-Format, das nicht symbolisiert ist

** **.

Mit dem Gerät verbunden

** **.

  • Laden Sie die Datei ".txt" herunter und ändern Sie die Erweiterung in ".crash". Geben Sie hier die Bildbeschreibung ein
    • Öffnen Sie Geräte und Simulatoren über die Registerkarte Fenster in Xcode
    • Gerät auswählen und Geräteprotokolle auswählen
    • Ziehen Sie die .crash-Datei per Drag & Drop in das Geräteprotokollfenster

Geben Sie hier die Bildbeschreibung ein

Dort können wir symbolisierte Absturzprotokolle sehen

Weitere Informationen zum Symbolisieren von Absturzprotokollen finden Sie unter dem Link


2

Aus Apples Dokumenten:

Absturzberichte symbolisieren Mit Xcode Xcode versucht automatisch, alle aufgetretenen Absturzberichte zu symbolisieren. Zur Symbolisierung müssen Sie lediglich den Absturzbericht zum Xcode Organizer hinzufügen.

  • Schließen Sie ein iOS-Gerät an Ihren Mac an
  • Wählen Sie "Geräte" aus dem Menü "Fenster"
  • Wählen Sie im Abschnitt "GERÄTE" in der linken Spalte ein Gerät aus
  • Klicken Sie im rechten Bereich im Abschnitt "Geräteinformationen" auf die Schaltfläche "Geräteprotokolle anzeigen"
  • Ziehen Sie Ihren Absturzbericht in die linke Spalte des angezeigten Bedienfelds
  • Xcode symbolisiert automatisch den Absturzbericht und zeigt die Ergebnisse an. Um einen Absturzbericht zu symbolisieren, muss Xcode in der Lage sein, Folgendes zu finden:

    1. Die Binär- und dSYM-Datei der abstürzenden Anwendung.

    2. Die Binärdateien und dSYM-Dateien für alle benutzerdefinierten Frameworks, mit denen die Anwendung verknüpft ist. Bei Frameworks, die mit der Anwendung aus dem Quellcode erstellt wurden, werden ihre dSYM-Dateien zusammen mit der dSYM-Datei der Anwendung in das Archiv kopiert. Bei Frameworks, die von einem Drittanbieter erstellt wurden, müssen Sie den Autor nach der dSYM-Datei fragen.

    3. Symbole für das Betriebssystem, auf dem diese Anwendung beim Absturz ausgeführt wurde. Diese Symbole enthalten Debug-Informationen für die Frameworks, die in einer bestimmten Betriebssystemversion enthalten sind (z. B. iOS 9.3.3). Betriebssystemsymbole sind architekturspezifisch - eine Version von iOS für 64-Bit-Geräte enthält keine armv7-Symbole. Xcode kopiert automatisch Betriebssystemsymbole von jedem Gerät, das Sie mit Ihrem Mac verbinden.

Wenn eines dieser Elemente fehlt, kann Xcode den Absturzbericht möglicherweise nicht oder nur teilweise symbolisieren.


2

Der einfachste Prozess zum Symbolisieren von Absturzprotokollen:

  1. Bewahren Sie die xcarchive-Datei vom Organizer während des IPA-Erstellungsprozesses für die zukünftige Verwendung auf.
  2. Sammeln Sie beim Absturz die Absturzprotokolle vom betroffenen Gerät. Die Erweiterung sollte .crash sein. Wenn das Absturzprotokoll im IP-Format vorliegt, benennen Sie es einfach in .crash um.
  3. Doppelklicken Sie im gespeicherten Pfad auf das xcarchive, damit es im Organizer angezeigt wird (falls noch nicht vorhanden).
  4. Öffnen Sie im Xcode-Fenster-> Geräte und Simulatoren -> Geräteprotokolle anzeigen -> Alle Protokolle -> Ziehen Sie die .crash-Datei per Drag & Drop.

Warten Sie 5 Sekunden. Knall! Die Anwendungsaufrufe im Stack-Trace werden symbolisiert! Möglicherweise sehen Sie dennoch viele Symbole! Dies sind interne Bibliotheks- und Framework-Aufrufe.

Dies ist die einfachste, bewährte!


1

Apple gibt Ihnen ein Absturzprotokoll im TXT-Format, das nicht symbolisiert ist

** **.

Mit dem Gerät verbunden

** **.

  • Laden Sie die Datei ".txt" herunter und ändern Sie die Erweiterung in ".crash". Geben Sie hier die Bildbeschreibung ein
    • Öffnen Sie Geräte und Simulatoren über die Registerkarte Fenster in Xcode
    • Gerät auswählen und Geräteprotokolle auswählen
    • Ziehen Sie die .crash-Datei per Drag & Drop in das Geräteprotokollfenster

Geben Sie hier die Bildbeschreibung ein

Dort können wir symbolisierte Absturzprotokolle sehen

Weitere Informationen zum Symbolisieren von Absturzprotokollen finden Sie unter dem Link

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.