Snapshots zur Fehlerbehebung

Nachdem Sie Ihre App bereitgestellt oder gestartet haben, können Sie Stackdriver Debugger in der Google Cloud Platform Console öffnen. Mit Stackdriver Debugger können Sie den Aufrufstapel und lokale Variablen Ihrer App erfassen und analysieren, ohne diese anzuhalten oder ihre Ausführung zu verlangsamen.

Besuchen Sie die Seite Fehlerbehebung in der Cloud Platform Console, um Google Stackdriver Debugger zu verwenden.

Vorbereitung

Stackdriver Debugger kann mit oder ohne Zugriff auf den Quellcode Ihrer App verwendet werden. Sollte der Quellcode nicht verfügbar sein, lesen Sie nachstehend den Abschnitt Snapshot zur Fehlerbehebung aufnehmen, um zu erfahren, wie Sie den Dateinamen und die Zeilennummer manuell eingeben können.

Um auf den lokal oder in einem Git-Repository gespeicherten Quellcode zuzugreifen, müssen Sie den Speicherort des Quellcodes auswählen.

Snapshots

Stackdriver Debugger-Snapshots erfassen die lokalen Variablen und den Aufrufstapel an einer bestimmten Zeilenposition im Quellcode Ihrer App. Sie können bestimmte Bedingungen und Positionen angeben, um einen Snapshot der App-Daten zurückzugeben und ihn sich im Detail anzusehen, um Fehler in der App zu beheben.

Wenige Sekunden nach dem Festlegen der Zeilenposition eines Snapshots gilt dieser für alle ausgeführten Instanzen Ihrer App. Sobald eine beliebige Instanz den Code an der betreffenden Snapshot-Position erstmalig ausführt, zeichnet Stackdriver Debugger einen Snapshot auf und stellt ihn zur Ansicht bereit. Der Debugger setzt verschiedene Strategien ein, um die durch die Datenerfassung verursachte Latenz so gering wie möglich zu halten.

Snapshot zur Fehlerbehebung aufnehmen

Konsole

Klicken Sie im Quellcode auf die Zeilennummer, um an dieser Position einen Snapshot zu erstellen.

  1. Wählen Sie das Snapshot-Steuerfeld im rechten Bereich aus.
  2. Wählen Sie im linken Bereich die Datei aus, die den zu prüfenden Quellcode enthält. Der Inhalt der ausgewählten Datei wird im mittleren Bereich angezeigt.
  3. Klicken Sie auf die Zeilennummer der Quellcode-Position.

Snapshot-Position suchen

Sie können auch mehrere Zeilen anklicken, um innerhalb einer Datei mehrere Snapshot-Positionen festzulegen.

Im Abschnitt Optionen für den Quellcode finden Sie weitere Methoden zum Laden Ihres Quellcodes in Stackdriver Debugger.

Ist kein Quellcode verfügbar, können Sie im Bereich Snapshot den Dateinamen und die Zeilennummer im Format Dateiname:Zeilennummer manuell eingeben, um einen Snapshot aufzunehmen:

Snapshot-Position manuell einstellen

gcloud

Eine Snapshot-Position über die Befehlszeile eingeben:

gcloud debug snapshots create LOCATION

Es gilt:

  • LOCATION entspricht dem Dateinamen und der Zeile, in der der Logpoint eingerichtet wird. Das Format ist DATEI:ZEILE, wobei DATEI der Dateiname allein oder der Dateiname mit so vielen vorangestellten Pfadkomponenten sein kann, wie erforderlich sind, um die Datei von anderen mit dem gleichen Namen zu unterscheiden. Ist der Dateiname im Fehlerbehebungsziel nicht eindeutig, gilt dies als Fehler.

Snapshot-Bedingungen (optional)

Eine Snapshot-Bedingung ist ein einfacher Ausdruck in der App-Sprache (unterstützt werden Java, Python und Go), dessen Ergebnis "wahr" sein muss, um Snapshots zu erstellen. Die Snapshot-Bedingungen werden jedes Mal ausgewertet, wenn die Zeile von einer Instanz ausgeführt wird, bis das Ergebnis "wahr" ist oder für den Snapshot eine Zeitüberschreitung eintritt.

Die Verwendung von Snapshot-Bedingungen ist optional.

Die Bedingung ist ein vollständiger boolescher Ausdruck, der logische Operatoren enthalten kann:

travelAccessory == “Towel”
ultimateAnswer <= 42
travelAccessory == “Towel” && ultimateAnswer <= 42

Konsole

Geben Sie die Bedingung im Feld Bedingung im Bereich Snapshot ein.

Snapshot-Bedingung erstellen

gcloud

Bedingungen werden mit dem Flag --condition von snapshots create erstellt:

gcloud debug snapshots create LOCATION \
  --condition="ultimateAnswer <= 42 && foo==bar"

Sie können die folgenden Sprachfunktionen verwenden, um Bedingungen auszudrücken:

Java

Die meisten Java-Ausdrücke werden unterstützt, einschließlich:
  • lokale Variablen: a == 8.
  • numerische und boolesche Operationen: x + y < 20.
  • Instanz- und statische Felder: this.counter == 20, this.myObj.isShutdown, myStatic oder com.mycompany..MyClass.staticMember.
  • Stringvergleiche mit dem Gleichheitsoperator: myString == "abc".
  • Funktionsaufrufe. Es können ausschließlich Funktionen mit Lesezugriff genutzt werden. Zum Beispiel wird StringBuilder.indexOf() unterstützt, StringBuilder.append() hingegen nicht.
  • Typumwandlung mit vollständig qualifizierten Typen: ((com.myprod.ClassImpl) myInterface).internalField

Folgende Sprachfunktionen werden nicht unterstützt:

  • Entpacken numerischer Datentypen wie Integer; verwenden Sie stattdessen myInteger.value.

Python

Die meisten Python-Ausdrücke werden unterstützt, einschließlich:
  • Lesen lokaler und globaler Variablen
  • Lesen aus Arrays, Listen, Segmenten, Dictionaries und Objekten
  • Aufrufen einfacher Methoden

Folgende Sprachfunktionen werden nicht unterstützt:

  • Aufruffunktionen, die neue Objekte zuweisen oder komplexe Konstrukte verwenden
  • Erstellen neuer Objekte innerhalb eines Ausdrucks

Go

Der überwiegende Teil der Go-Syntax wird unterstützt, einschließlich:
  • Lesen lokaler und globaler Variablen
  • Lesen aus Arrays, Segmenten, Maps und Structs

Folgende Sprachfunktionen werden nicht unterstützt:

  • Lesen aus Schnittstellenwerten
  • Typumwandlungen und zusammengesetzte Literale
  • Alle Funktionsaufrufe außer len

Ausdrücke (optional)

Mit der Ausdrucksfunktion von Stackdriver Debugger können Sie komplexe Ausdrücke auswerten oder Objekthierarchien durchsuchen, nachdem ein Snapshot aufgenommen wurde. Bei den Ausdrücken werden die gleichen Sprachfunktionen unterstützt wie bei den vorstehend beschriebenen Snapshot-Bedingungen.

Die Verwendung von Ausdrücken ist optional.

Ausdrücke werden in der Regel für Folgendes genutzt:

  • Anzeige statischer oder globaler Variablen, die nicht Bestandteil des lokalen Variablensatzes sind
  • Anzeige komplex verschachtelter Membervariablen, ohne jedes Mal eine lokale Variable im Debugger-Bereich aufschlüsseln zu müssen
  • Um wiederholte mathematische Berechnungen zu vermeiden. Zum Beispiel durch Berechnung einer Zeitspanne in Sekunden mit (endTimeMillis - startTimeMillis) / 1000.0.

Einen Ausdruck hinzufügen:

Konsole

  1. Geben Sie den Ausdruck in das Feld Ausdruck ein. Drücken Sie die Tabulatortaste, um weitere Ausdrücke hinzuzufügen.
  2. Drücken Sie die Eingabetaste oder klicken Sie auf die Schaltfläche Snapshot Snapshot-Schaltfläche.

Das Ergebnis des Ausdrucks wird angezeigt, wenn der Snapshot erstellt wird.

Ausdruck definieren

gcloud

Ausdrücke werden mit dem Flag --expression von snapshots create definiert:

gcloud debug snapshots create LOCATION \
  --expression="histogram.length"

Snapshot ansehen

Konsole

Die Snapshot-Daten werden in Stackdriver Debugger angezeigt, wenn die App den Quellcode an der von Ihnen festgelegten Position ausführt. Die Instanzvariablen und die lokalen Variablen werden im Abschnitt Variablen des Felds angezeigt. Der Stacktrace wird im Bereich Aufrufstapel der Ansicht angezeigt.

Snapshot ansehen

Sobald der Snapshot aufgenommen wurde, können Sie sofort die Werte der lokalen Variablen prüfen und die tieferen Datenstrukturen genau untersuchen. Außerdem können Sie auf den Rahmen eines beliebigen Aufrufstapels klicken, um die lokalen Variablen auf der jeweiligen Stapelebene zu analysieren.

Wenn Sie in einer Datei mehrere Snapshot-Positionen eingerichtet haben oder Snapshots anzeigen möchten, die bereits aufgenommen wurden, erweitern Sie den Bereich Snapshot-Verlauf:

gcloud

So rufen Sie die URL der Cloud Platform Console für einen Snapshot über die Befehlszeile ab:

gcloud debug snapshots list

STATUS  LOCATION                   CONDITION  COMPLETED_TIME  ID                  VIEW
ACTIVE  HighScoreService.java:105                             53bd97d4-b6c6-74fc  https://console.cloud.google.com/debug/fromgcloud?project=abc&dbgee=def&bp=ghi

Kopieren Sie den Wert der Spalte VIEW und fügen Sie ihn in Ihren Browser ein, um den Snapshot in der Cloud Platform Console anzuzeigen.

So zeigen Sie detaillierte Snapshot-Daten über die Befehlszeile an:

gcloud debug snapshots describe 53bb1240f371b-baa0-feb5d

Mit dem Befehl describe werden der Stacktrace und die Werte lokaler Variablen ausgegeben, die Ausgabe ist aber eher maschinenlesbar ausgelegt und kein Klartext.

---
consoleViewUrl: https://console.cloud.google.com/debug/fromgcloud?project=1234&dbgee=gcp%3A1234%3A843aef0bd82301f7&bp=53bb1240f371b-baa0-feb5d
createTime: '2016-08-22T23:09:32.000Z'
finalTime: '2016-08-22T23:10:16.000Z'
id: 53bb1240f371b-baa0-feb5d
isFinalState: true
location: HighScoreService.java:105
stackFrames:
<... snip ...>

Snapshot erneut aufnehmen

Ein Snapshot wird nur einmal aufgenommen. Wenn Sie einen weiteren Snapshot der Daten Ihrer App an derselben Position erfassen möchten, können Sie ihn noch einmal manuell aufnehmen.

Konsole

Um einen Snapshot erneut aufzunehmen, klicken Sie auf das Kamerasymbol oben rechts im Bereich Snapshot:

Snapshot-Schaltfläche

Der neue Snapshot wird dem Snapshot-Verlauf hinzugefügt. Auch Snapshots, die in der jeweiligen Zeile zu einem früheren Zeitpunkt aufgenommen wurden, können im Bereich Snapshot-Verlauf oder über die Markierung der jeweiligen Zeilennummer abgerufen werden:

Frühere Snapshots über die Zeilenmarkierung anzeigen

gcloud

Um über die Befehlszeile einen weiteren Snapshot aufzunehmen, wiederholen Sie den Befehl create, den Sie ursprünglich verwendet haben:

gcloud debug snapshots create LOCATION

Snapshot-Position löschen

Konsole

Um eine Snapshot-Position zu löschen, klicken Sie auf das X in der Snapshot-Markierung.

Snapshot-Symbol

gcloud

Einen Snapshot über die Befehlszeile löschen:

gcloud debug snapshots delete (ID | LOCATION-REGEXP)

Dabei gilt:

  • ID ist der Wert, der von gcloud debug snapshots list zurückgegeben wird.

  • LOCATION-REGEXP ist ein regulärer Ausdruck, der die Code-Position des oder der Snapshots angibt.

Snapshots teilen

Sie können einen Snapshot mit anderen Projektmitgliedern teilen. Kopieren Sie dazu die URL des Snapshots aus Ihrem Browser oder aus der Ausgabe des Befehls gcloud debug snapshots list und stellen Sie sie einem anderen Nutzer zur Verfügung, der Zugang zu Ihrem Projekt hat. Sie können diese URL auch speichern, um die Ergebnisse zu einem späteren Zeitpunkt erneut anzuzeigen. Stackdriver Debugger erstellt für jeden aufgenommenen Snapshot eine neue URL. Auf diese Weise können Sie die Ergebnisse als separate Sets teilen, auch wenn sie von Snapshots stammen, die an derselben Codeposition aufgenommen wurden. Das Teilen von Snapshots ist bis maximal 30 Tage nach ihrer Aufnahme möglich.

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Stackdriver Debugger-Dokumentation