Cloud Debugger wurde verworfen und wird am 31. Mai 2023 eingestellt. Weitere Informationen finden Sie auf der Seite Einstellung und in den Versionshinweisen.

Debugging-Snapshots

Nachdem Sie die 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 die Seite Fehlerbehebung in der Google Cloud Console auf, um Debugger zu verwenden.

Hinweis

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.

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

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 festgelegt haben, testet der Debugger-Agent den Snapshot für eine Teilmenge Ihrer Instanzen. Nachdem der Debugger-Agent überprüft hat, ob der Snapshot erfolgreich ausgeführt werden kann, wird der Snapshot auf alle Instanzen angewendet. Dies dauert etwa 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.

Der folgende Text wird angezeigt, wenn der Debugger-Agent einen Canary-Test ausführt:

Der Haltepunkt einer Teilmenge von Anwendungsinstanzen wird verifiziert.

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 dazu, welche Versionen des Debugger-Agents Canary-Funktionen haben.

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

Console

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

  1. Achten Sie darauf, dass das Feld Snapshot ausgewählt ist.
  2. Wählen Sie die Datei aus, die den 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

Dabei gilt:

  • 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

Console

Erstellen Sie einen Snapshot, um die Bedingung anzugeben. Geben Sie im Feld Bedingung eine Bedingung ein und wählen Sie Aktualisieren aus. Wenn die Bedingung als "true" ausgewertet wird, wird der Snapshot ausgelöst.

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 Vorgänge: 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 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:

  • Unboxing von numerischen Typen wie Integer; verwenden Sie stattdessen myInteger.value.

Python

Die meisten Python-Ausdrücke werden unterstützt, darunter:
  • 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

Die meisten Go-Ausdrücke werden 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 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
  • Vermeiden wiederholter mathematischer Berechnungen Zum Beispiel durch Berechnung einer Zeitspanne in Sekunden mit (endTimeMillis - startTimeMillis) / 1000.0.

Einen Ausdruck hinzufügen:

Console

  1. Geben Sie den Ausdruck in das Feld Ausdruck ein. Sie können beliebig viele Ausdrücke hinzufügen.
  2. Wählen Sie Neu erstellen aus.

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:

Snapshot-Verlauf ansehen

gcloud

So rufen Sie die URL der Google Cloud 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 Google Cloud Console anzusehen.

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.

Console

Wählen Sie Neu erstellen aus, um einen Snapshot noch einmal aufzunehmen:

Schaltfläche "Neu erstellen" ausgewählt.

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

Console

Klicken Sie auf , um die Snapshot-Position zu löschen.

Snapshot entfernen.

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 freigeben, indem Sie die Snapshot-URL aus Ihrem Browser oder aus der Ausgabe des Befehls gcloud debug snapshots list kopieren und einem anderen Nutzer zuweisen, der Zugriff auf Ihr Projekt hat. Sie können diese URL auch speichern, um die Ergebnisse zu einem späteren Zeitpunkt erneut 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.

Problembehebung

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

Wenn der Debugger-Agent fehlerhaft ist, wird möglicherweise der folgende Fehler angezeigt:

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 mit einem angewendeten Canary-Snapshot heruntergefahren wird, sieht es so aus, als ob der Debugger-Agent die Instanz beendet hat. Prüfen Sie, ob Instanzen innerhalb von 40 Sekunden nach dem Festlegen des Snapshots heruntergefahren wurden. Beispielsweise kann das Autoscaling von Cloud Run und App Engine oder die Bereitstellung von neuem Code der Grund für das Herunterfahren von Instanzen sein.

Sie sollten den Debugger-Agent aus Ihren Instanzen entfernen und die vorherige Version neu installieren. Folgen Sie der Einrichtungsanleitung für die Installation der vorherigen Version des Debugger-Agents, um die vorherige Version neu zu installieren.

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.