Cloud デバッガでデバッグを設定し、アプリをデプロイまたは起動すると、ソースコンソールでデバッグ スナップショットの作成や表示ができます。
スナップショットの概要
スナップショットは、アプリのソースコード内の特定の行位置でローカル変数とコールスタックを収集します。指定した条件や行の位置に基づいてアプリの状態のスナップショットを返すことができます。スナップショットの詳細は、コードのデバッグに役立ちます。
行位置を設定して数秒後、スナップショットの設定がアプリで実行中のすべてのインスタンスに適用されます。任意のインスタンスがスナップショットの場所でコードを初めて実行すると、Debugger がスナップショットを作成し、閲覧できるようにします。Debugger では、データをキャプチャする際に生じるレイテンシを最小限に抑えるいくつかの手法を実装しています。
起動時の Debugger の初期化中に、スナップショットを使用できない場合があります。
デバッグ スナップショットの作成
Google Cloud Console で、Cloud Source Repositories を開きます。
[すべてのリポジトリ] ページが開きます。または、マイソースのビューを開くこともできます。
リポジトリの名前をクリックし、監視するソースコードが含まれているファイルに移動します。
ソースコードの場所の行番号をクリックします。
プロンプトが表示されたら、デバッグするアプリを選択して、[続行] をクリックします。
[スナップショットを作成] をクリックします。
Google Cloud Console の隣接ペインに新しいスナップショットが表示されます。
スナップショット条件(オプション)
スナップショットの条件とは、スナップショットを作成するために true
と評価される必要がある式です。Java、Python、Go の式がサポートされています。スナップショットの条件は、任意のインスタンスによって条件が true
と評価されるかスナップショットがタイムアウトするまで、行が実行されるたびに評価されます。
条件は、論理演算子を含めることができる完全なブール式です。
travelAccessory == "Towel"
ultimateAnswer <= 42
travelAccessory == "Towel" && ultimateAnswer <= 42
スナップショット条件の設定
GCP Console で [スナップショット] タブをクリックし、スナップショットを選択します。
[スナップショット] パネルが開いたら、[スナップショットの編集] をクリックします。
[条件] フィールドに、スナップショット条件を入力します。
[更新] をクリックします。
条件を表現するために、次の言語機能を使用できます。
Java
ほとんどの Java 式がサポートされています。たとえば、以下の式がサポートされています。- ローカル変数:
a == 8
- 数値とブール演算子:
x + y < 20
- インスタンスと静的フィールド:
this.counter == 20
、this.myObj.isShutdown
、myStatic
、com.mycompany.MyClass.staticMember
。 - 等価演算子による文字列の比較:
myString == "abc"
- 関数の呼び出し。読み取り専用関数のみ使用できます。たとえば、
StringBuilder.indexOf()
はサポートされていますが、StringBuilder.append()
はサポートされていません。 - 完全修飾型での型キャスト:
((com.myprod.ClassImpl) myInterface).internalField
次の言語機能はサポートされていません。
- 数値型(
Integer
など)のボックス化解除。代わりにmyInteger.value
を使用してください。
Python
以下を含め、ほとんどの Python 式はサポートされています。- ローカル変数とグローバル変数の読み取り。
- 配列、リスト、スライス、辞書、オブジェクトからの読み取り。
- シンプルなメソッドの呼び出し。
次の言語機能はサポートされていません。
- 新しいオブジェクトを割り当てる関数、または複雑な構文を使用する関数の呼び出し。
- 式の中での新しいオブジェクトの作成。
Go(ベータ版)
以下を含め、ほとんどの Go 式構文がサポートされています。- ローカル変数とグローバル変数の読み取り。
- 配列、スライス、マップ、構造体からの読み取り。
次の言語機能はサポートされていません。
- インターフェース値からの読み取り。
- 型変換と複合リテラル。
len
以外の関数の呼び出し。
式(オプション)
スナップショット式を使用すると、スナップショットの作成時に複雑な式を評価することや、オブジェクト階層の走査ができます。式では、前述したスナップショットの条件の場合と同じ言語機能をサポートしています。
式の一般的な用途は次のとおりです。
ローカル変数セットの一部ではない静的変数またはグローバル変数の表示。
Debugger パネル内のローカル変数を毎回拡張する必要のない、深くネストされたメンバー変数の表示。
反復的な数学的計算の回避。たとえば、
(endTimeMillis - startTimeMillis) / 1000.0
での秒単位の時間の計算。
式の追加
GCP Console の下部ペインで、[スナップショット] タブをクリックし、スナップショットを選択します。
開いたパネルで、[スナップショットの編集] をクリックします。
[式] フィールドに式を入力します。
式を追加する場合は、Tab キーを押します。
[更新] をクリックします。
スナップショットの表示
指定した場所でアプリがソースコードを実行すると、ソース コンソールにスナップショットのデータが表示されます。
GCP Console の下部ペインで、[スナップショット] タブをクリックし、スナップショットを選択します。
スナップショットの詳細を含むパネルに、スナップショット コードの場所のインスタンス変数とスタック トレースの値が表示されます。
スナップショットが作成された瞬間のローカル変数の値を調べて、より深いデータ構造をドリルダウンできます。また、任意のコールスタック フレームをクリックして、スタック内のそのレベルでローカル変数を調べることができます。
スナップショットの再作成
スナップショットは、一度だけ作成されます。同じ場所でアプリの状態の別のスナップショットを取得するには、以下の手順に従います。
GCP Console の [スナップショット] パネルで、ポインタをスナップショットの上に置きます。
[再作成] をクリックします。
スナップショットの場所の削除
GCP Console の [スナップショット] パネルで、ポインタをスナップショットの上に置きます。
[削除] delete をクリックします。
スナップショットの共有
ブラウザからスナップショットの URL を共有して、スナップショットを共有できます。今後の参考のために URL を保存して、スナップショットの結果を再度表示することもできます。Debugger は、スナップショットが作成されるごとに新しい URL を使用します。これにより、コード内の同じ場所でスナップショットが作成された場合であっても、個別に結果のセットを共有できます。