Debugging-Snapshots

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

Rufen Sie zur Verwendung von Debugger die Seite Debugging der Cloud Console auf.

Hinweise

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

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

Snapshots

Snapshots erfassen die lokalen Variablen und den Aufrufstack an einer bestimmten Zeilenposition im Quellcode Ihrer Anwendung. 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.

Debugger-Agent mit Canary-Test

Nachdem Sie einen Snapshot erstellt haben, testet der Debugger-Agent den Snapshot an einer Teilmenge Ihrer Instanzen. Nachdem der Debugger-Agent bestätigt hat, dass der Snapshot erfolgreich ausgeführt werden kann, wird der Snapshot auf alle Instanzen angewendet. Dies dauert ungefähr 40 Sekunden.

Nach dem Auslösen des Snapshots werden die Ergebnisse in den Bereichen Variablen und Aufrufstack angezeigt. Wenn der Snapshot innerhalb von 40 Sekunden nach dem Festlegen ausgelöst wird, werden die Ergebnisse der Instanzen angezeigt, auf die der Canary-Snapshot angewendet wurde.

Der Debugger-Agent setzt verschiedene Strategien ein, um die durch die Datenerfassung verursachte Latenz so gering wie möglich zu halten.

Sie sehen Folgendes, während der Debugger-Agent den Canary-Test ausführt:

Der Debugger-Agent führt Canary-Instanzen aus

Informationen zur Reaktion darauf, wenn der Debugger-Agent im Canary-Modus ausfällt, finden Sie im Abschnitt "Fehlerbehebung" auf der Seite "Snapshots zur Fehlerbehebung".

Auf den sprachspezifischen Seiten finden Sie Informationen zu den Debugger-Agent-Versionen.

Debugger-Agent ohne Canary-Test

Wenn Sie den Debugger-Agent ohne Canary-Test verwenden und einen Snapshot festlegen, gilt dieser für alle ausgeführten Instanzen Ihrer Anwendung. Wenn eine Instanz den Code zum ersten Mal am Snapshot-Speicherort ausführt, erstellt der Debugger-Agent einen Snapshot und stellt ihn zur Ansicht bereit. Der Debugger-Agent setzt verschiedene Strategien ein, um die durch die Datenerfassung verursachte Latenz so gering wie möglich zu halten.

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

Wobei:

  • LOCATION entspricht dem Dateinamen und der Zeile, in der der Snapshot 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 Anwendungssprache (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 angegeben:

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, darunter:
  • Lokale Variablen: a == 8.
  • Numerische und boolesche Operatoren: x + y < 20.
  • Instanzfelder 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 schreibgeschützte Funktionen genutzt werden. Beispiel: StringBuilder.indexOf() wird unterstützt, StringBuilder.append() jedoch 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 Sprachfeatures 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, darunter:
  • 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 Debugger können Sie komplexe Ausdrücke auswerten oder in Objekthierarchien suchen, 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
  • Vermeiden wiederholter mathematischer Berechnungen 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

Console

Die Snapshot-Daten werden in Debugger angezeigt, wenn die Anwendung den Quellcode an der von Ihnen festgelegten Position ausführt. Die Instanzvariablen und die lokalen Variablen werden im Abschnitt Variables (Variablen) der Ansicht angezeigt. Der Stacktrace wird im Bereich Call Stack (Aufrufstack) 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 Frame eines beliebigen Aufrufstacks klicken, um die lokalen Variablen auf der jeweiligen Stackebene 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 Cloud Console-URL 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 Console aufzurufen.

Detaillierte Snapshot-Daten über die Befehlszeile anzeigen:

gcloud debug snapshots describe 53bb1240f371b-baa0-feb5d

Mit dem Befehl describe werden der Stacktrace und die Werte lokaler Variablen zurückgegeben, 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

Klicken Sie auf das Kamerasymbol oben rechts im Bereich Snapshot, um einen Snapshot noch einmal aufzunehmen:

Snapshot-Schaltfläche

Der neue Snapshot wird dem Snapshot-Verlauf hinzugefügt. Auch Snapshots, die in der jeweiligen Zeile früher 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

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

gcloud debug snapshots create LOCATION

Snapshot-Position löschen

Konsole

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

Snapshot-Symbol

gcloud

Einen Snapshot über die Befehlszeile löschen:

gcloud debug snapshots delete (ID | LOCATION-REGEXP)

Wobei:

  • 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 später noch einmal anzuzeigen. 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.

Fehlerbehebung

Hat der Debugger-Agent meine Instanzen abstürzen lassen?

Möglicherweise wird der folgende Fehler angezeigt, wenn der Debugger-Agent fehlerhaft ist:

Im Bereich Variablen wird eine Fehlermeldung angezeigt

Sie könnten falsch positive Ergebnisse erhalten, wodurch es erscheint, als ob der Debugger-Agent seine Sicherheitsmaßnahmen aus den folgenden Gründen ausgelöst hat:

  • Eine Instanz wurde heruntergefahren, während der Debugger-Agent einen Canary-Test ausführte.

    Wenn eine Instanz, auf die ein Canary-Snapshot angewendet wird, heruntergefahren wird, sieht sie so aus, dass der Debugger-Agent die Instanz beendet hat. Prüfen Sie, dass keine Instanzen innerhalb von 40 Sekunden nach dem Festlegen des Snapshots heruntergefahren wurden. Zum Beispiel können die automatische Skalierung von Cloud Run und App Engine oder das Bereitstellen von neuen Code dazu führen, dass Instanzen heruntergefahren werden.

Entfernen Sie den Debugger-Agent aus Ihren Instanzen und installieren Sie die vorherige Version neu. Wenn Sie die vorherige Version neu installieren möchten, folgen Sie der Anleitung zur Installation der vorherigen Version des Debugger-Agents.

Wenn das Problem mit der alten Version des Agents weiterhin besteht, prüfen Sie, ob es sich um ein falsch positives Ergebnis handelt. Deaktivieren Sie dann den Debugger-Agent und senden Sie Feedback.