デバッグ スナップショット

アプリをデプロイして起動すると、Google Cloud Platform Console で Stackdriver Debugger を開くことができます。Stackdriver Debugger を使用することで、アプリを停止したり、実行速度を落としたりしなくても、アプリのコールスタックとローカル変数をキャプチャしたり、検査したりすることができます。

Google Stackdriver Debugger の使用方法については、GCP Console のデバッグをご覧ください。

始める前に

Stackdriver Debugger は、アプリのソースコードへのアクセス権の有無に関係なく使用できます。ソースコードが入手できない場合は、下記のデバッグ スナップショットの作成で、手動でファイル名と行番号を入力する手順をご覧ください。

ローカルまたは Git リポジトリに格納されているソースコードにアクセスするには、ソースコードの場所の選択が必要となる場合があります。

スナップショット

Stackdriver Debugger スナップショットは、ソースコード内の特定の行の場所で、ローカル変数とコールスタックを収集します。アプリのデータのスナップショットを返す特定の条件と場所を指定して、詳細を表示し、アプリのデバッグを行うことができます。

スナップショットの行位置を設定して数秒後、この場所がアプリで実行中のすべてのインスタンスに適用されます。任意のインスタンスがスナップショットの場所でコードを初めて実行すると、Stackdriver Debugger は、スナップショットを作成し、閲覧できるようにします。Stackdriver Debugger は、データをキャプチャする際に生じるレイテンシを最小限に抑えるいくつかの手法を実装しています。

デバッグ スナップショットの作成

Console

スナップショットを作成したい場所の、ソースコードの行番号をクリックします。

  1. 右側のパネルで [スナップショット] パネルが選択されていることを確認します。
  2. 左側のパネルで、監視するソースコードを含むファイルを選択します。選択したファイルの内容が中央のパネルに表示されます。
  3. ソースコードの場所の行番号をクリックします。

スナップショットの場所を参照

複数の行をクリックすると、ファイルに複数のスナップショットを設定できます。

Stackdriver Debugger にソースコードを読み込む他の方法については、ソースコードのオプションをご覧ください。

使用可能なソースコードがない場合は、「ファイル名:行」を手動で入力し、[スナップショット] パネルでスナップショットを取得できます。

手動でスナップショットの場所を設定

gcloud

コマンドラインを使用してスナップショットの場所を設定するには、以下のコマンドを実行します。

gcloud debug snapshots create LOCATION

各パラメータの意味は次のとおりです。

  • LOCATION は、ログポイントを設定するファイルの名前と行です。FILE:LINE の形式で指定します。ここで、FILE はファイル名です。同じ名前の他のファイルと区別するために、ファイル名の前に必要なパス コンポーネントを追加することもできます。デバッグ対象に一意ではないファイル名を指定するのは誤りです。

スナップショット条件(オプション)

スナップショットの条件とは、アプリの言語(Java、Python、Go をサポート)における単純な式のことで、作成するスナップショットについて true に評価される必要があります。スナップショットの条件は、任意のインスタンスによって条件が true と評価されるかスナップショットがタイムアウトするまで、行が実行されるたびに評価されます。

スナップショット条件の使用はオプションです。

条件は、論理演算子を含めることができる完全なブール式です。

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

Console

条件を指定する場合は、[スナップショット] パネルの [条件] フィールドに入力します。

スナップショットの条件を設定

gcloud

条件を指定するには、次に示すように snapshots create--condition フラグを使用します。

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

条件を表現するために、次の言語機能を使用することができます。

Java

ほとんどの Java 式がサポートされています。たとえば、以下の式がサポートされています。
  • ローカル変数: a == 8
  • 数値およびブール演算子: x + y < 20
  • インスタンスおよび静的フィールド: this.counter == 20this.myObj.isShutdownmyStaticcom.mycompany.MyClass.staticMember
  • 等価演算子による文字列の比較: myString == "abc"
  • 関数の呼び出し。読み取り専用機能のみ使用できます。たとえば、StringBuilder.indexOf() はサポートされていますが、StringBuilder.append() はサポートされていません。
  • 完全修飾型を含む型キャスト: ((com.myprod.ClassImpl) myInterface).internalField

次の言語機能はサポートされていません

  • 数値型(Integer など)のボックス化解除。代わりに myInteger.value を使用してください。

Python

以下を含め、ほとんどの Python 式はサポートされています。
  • ローカル変数とグローバル変数の読み取り。
  • 配列、リスト、スライス、辞書およびオブジェクトからの読み取り。
  • シンプルなメソッドの呼び出し。

次の言語機能はサポートされていません。

  • 新しいオブジェクトを割り当てる関数、または複雑な構文を使用する関数の呼び出し。
  • 式の中での新しいオブジェクトの作成。

Go

以下を含め、ほとんどの Go 式構文がサポートされています。
  • ローカル変数とグローバル変数の読み取り。
  • 配列、スライス、マップ、構造体からの読み取り。

次の言語機能はサポートされていません。

  • インターフェース値からの読み取り。
  • 型変換と複合リテラル。
  • len 以外の関数の呼び出し。

式(オプション)

Stackdriver Debugger の式機能を使用することで、スナップショットの作成時に複雑な式を評価したり、オブジェクト階層を操作したりすることができます。式では、前述したスナップショットの条件での場合と同じ言語機能をサポートしています。

式の使用はオプションです。

式の典型的な用途は以下のとおりです。

  • ローカル変数セットの一部ではない静的変数またはグローバル変数の表示。
  • デバッガパネル内のローカル変数を毎回拡張する必要のない、深くネストされたメンバー変数の簡単な表示。
  • 反復的な数学的計算の回避。たとえば、(endTimeMillis - startTimeMillis) / 1000.0 での秒単位の時間の計算。

式を追加するには:

Console

  1. [] フィールドに式を入力します。Tab キーを押して、式を追加します。
  2. Enter キーまたは [スナップショット] ボタン [スナップショット] ボタン を押します。

スナップショットが作成されると、式の結果が表示されます。

式を設定

gcloud

式を定義するには、snapshots create--expression フラグを使用します。

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

スナップショットの表示

Console

指定した場所でアプリがソースコードを実行すると、Stackdriver Debugger にスナップショットのデータが表示されます。インスタンス変数とローカル変数は、パネルの [変数] セクションに表示されます。スタック トレースは、パネルの [コールスタック] セクションに表示されます。

スナップショットを表示

スナップショットが作成された瞬間のローカル変数の値を調べて、より深いデータ構造をドリルダウンすることができます。また、任意のコール スタック フレームをクリックして、スタック内のそのレベルでローカル変数を調べることができます。

ファイルに複数のスナップショットを設定した場合や、作成済みのスナップショットを表示する場合は、[スナップショットの履歴] パネルを展開します。

gcloud

コマンドラインを使用して GCP Console の URL を取得するには、以下のコマンドを実行します。

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

GCP Console でスナップショットを表示するには、VIEW 列の値をコピーしてブラウザに貼り付けます。

コマンドラインを使用して詳細なスナップショット データを表示するには、以下のコマンドを実行します。

gcloud debug snapshots describe 53bb1240f371b-baa0-feb5d

describe コマンドは、スタック トレースとローカル変数の値を返します。このコマンドは、人が読める出力ではなく、マシンが読み取れる出力を返すことを主な目的としています。

---
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 ...>

スナップショットの再作成

スナップショットは、一度だけ作成されます。アプリデータの別のスナップショットを同じ場所で取得する場合には、手動でスナップショットを取得します。

Console

スナップショットを取り直すには、[スナップショット] パネルの右上にあるカメラアイコンをクリックします。

[スナップショット] ボタン

新しいスナップショットが [スナップショットの履歴] パネルに追加されます。その行の過去のスナップショットには [スナップショットの履歴] またはその行番号のマーカーからアクセスできます。

以前のスナップショットがラインマーカーに表示される

gcloud

コマンドラインを使用してスナップショットを再作成するには、最初に使用した create コマンドを繰り返します。

gcloud debug snapshots create LOCATION

スナップショットの場所の削除

Console

スナップショットの場所を削除するには、スナップショット マーカーの X をクリックします。

[スナップショット] アイコン

gcloud

コマンドラインを使用してスナップショットを削除するには、以下のコマンドを実行します。

gcloud debug snapshots delete (ID | LOCATION-REGEXP)

ここで:

  • IDgcloud debug snapshots list から返される値です。

  • LOCATION-REGEXP は、スナップショットのコードの場所を定義する正規表現です。

スナップショットの共有

ブラウザまたは gcloud debug snapshots list コマンドの出力からスナップショットの URL をコピーし、プロジェクトにアクセスできる他のユーザーに送ることで、プロジェクトの他のメンバーとスナップショットを共有できます。今後の参考のために URL を保存して、スナップショットの結果を再度表示することもできます。Stackdriver Debugger は、スナップショットが作成されるごとに新しい URL を使用します。これにより、コード内の同じ場所でスナップショットが作成された場合であっても、個別に結果のセットを共有することができます。共有の有効期限は、スナップショットが作成されてから 30 日間です。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Stackdriver Debugger のドキュメント