クイックスタート

このクイックスタートでは、Cloud デバッガを使用して、App Engine で実行されているシンプルな Python アプリの状態をデバッグする方法を説明します。このクイックスタートでは、以下を行います。

  • ローカル変数およびコールスタックの検査
  • ログ ステートメントの生成
  • スナップショット条件の設定、および式の使用

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud SDK をインストールして初期化します。
  5. 次のソフトウェアがローカル システムにインストールされていることを確認します。

サンプルアプリを App Engine にデプロイする

まず、Python 3.7 アプリを App Engine にデプロイします。

  1. ローカルマシンにアプリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. アプリを含むディレクトリに移動します。

    cd python-docs-samples/appengine/standard_python3/cloud_debugger
    
  3. 次のコマンドを実行して、アプリを App Engine にデプロイします。

    gcloud app deploy
    

    プロンプトが表示されたら、App Engine アプリを配置するリージョンを選択します。

  4. 次のコマンドを実行してアプリを表示します。

    gcloud app browse
    

    アプリがブラウザ ウィンドウで自動的に開かない場合は、デバイスに表示される URL をクリックします。

    アプリに、文字列を入力するように求めるプロンプトが表示されます(フィールドにはすでに文字が入力されています)。

    送信ボタンおよび「abcd」と入力されたフィールドを示すサンプルアプリ。

  5. [Submit] をクリックします。

    プログラムの出力と正しい出力の 2 つの結果を表示するサンプルアプリ。

[Submit] をクリックすると 2 つの結果が表示されます。一方には、[Program Output] というラベルがついており、ソースコードの Reverse メソッドからの出力が表示されます。もう片方には、[Correct Output] というラベルがついており、Python のリスト逆順関数からの出力です。

[Program Output] と [Correct Output] は本来一致するはずですが、ソースコードに問題があります。Debugger を使用して問題を診断します。

デプロイされたソースコードを表示する

アプリをデプロイすると、デプロイされたソースコードが Google Cloud Console の [デバッグ] ページに表示されます。

  1. Google Cloud Console の [デバッグ] ページに移動します。

    [デバッグ] ページへ移動

  2. 正しいプロジェクトが選択されていることを確認します。

    正しいプロジェクトが選択されていることを強調表示したプロジェクト セレクタ プルダウン メニュー。

  3. デプロイされたファイルが選択されており、アプリのファイルが存在していることを確認し、Debugger がデプロイされたファイルにアクセスできることを確かめます。

    デプロイされたアプリが選択されていることを示すプルダウン メニュー。

  4. 正しいバージョンのアプリが選択されていることを確認します。

    プルダウン メニューから、アプリの正しいバージョンが選択されているかを確認できます。

    App Engine は、アプリのデプロイされたすべてのバージョンを保持します。Debugger を使用している場合は、正しいバージョンのアプリが選択されていることを確認します。

    main.py ファイルを選択すると、次のコードブロックが表示されます。

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    import logging
    logging.basicConfig(level=logging.INFO)
    

    以下のセクションでは、try / except ブロックを使用して Debugger エージェントをインポートして有効化します。

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    以下のセクションでは、ロギングを構成します。

    import logging
    logging.basicConfig(level=logging.INFO)
    

これで、デバッグ スナップショットを取得し、デバッグ ログポイントを挿入してソースコードの問題を診断する準備ができました。

デバッグ スナップショットを作成する

デバッグ スナップショットは、特定の行位置におけるローカル変数とコールスタックをキャプチャします。

  1. tmp 変数を含む行番号をクリックして、デバッグ スナップショットを取得します。スナップショットが設定されていることを示す青い矢印が表示されます。また、結果パネルには「スナップショットがヒットするまで待機しています」と表示されます。

    スナップショットが行 47 に設定されていることを示すデバッガ インターフェース。

  2. ページを更新して、スナップショットをトリガーします。

    [変数] ペインに変数の値が表示されます。ループの最初のパスで chars 配列が正しく入力されていることを確認します。今回の例では、問題は見つかりませんでした。ブレークポイントが最初にヒットしたときに、スナップショットが作成されたためです。

    スナップショット取得後の変数の値を表示する結果パネル。

    [コールスタック] ペインに、コールスタックの結果が表示されます。[コールスタック] ペインの関数をクリックすると、コード内のその時点のローカル変数とパラメータが表示されます。ReverseString をクリックすると、入力が正しいことを確認できます。

    スナップショット取得後のコールスタックの値を表示する結果パネル。

スナップショットを取得して、変数とコールスタックを検査しても問題が見つからなかった場合は、ログポイントを使用して問題を探ります。

デバッグ ログポイントを挿入する

デバッグ ログポイントを使用すると、アプリを再起動せずに、実行中のアプリにロギングを挿入できます。

  1. [ログポイント] タブを選択して、ログポイントを挿入します。

  2. tmp 変数を含む行番号をクリックします。インライン テキスト ボックスが表示されます。以下のように各フィールドを指定し、[追加] をクリックします。

    if (True) logpoint("About to swap two characters. Chars is currently {chars}")
    

    行 47 に設定されたログポイント。

    ログポイントの構造は次のとおりです。if(condition)logpoint(string)。以下の 2 項目を指定して、ログポイントを作成します。

    • 条件。ソースコードの構文で記述します。

    • 文字列。波括弧内に、ソースコードの構文で記述された式を何個でも含めることができます。

  3. ログポイントが正常に挿入されたことを確認するには、[ログポイントの履歴] タブを選択します。

    ログポイントが行 18 に設定されたことを示す [ログポイントの履歴] タブ。

  4. ページを更新して、ログポイントをトリガーします。

  5. ログポイントによって生成されたログを表示するには、[ログ] パネルを選択して更新ボタン をクリックします。

    ログポイントの結果を表示する [ログ] タブ。

問題の診断

ログポイントでは、while ループが 3 回実行されることが示されていますが、実行すべき回数は 2 回だけです。ログポイントがループの先頭に設定されているので、すでに反転された文字列の文字をスワップしようとしたことがログに記録されました。

while ループが 3 回実行されたことを示すログ。

問題を特定するために、条件付きのデバッグ スナップショットを使用します。

条件を使用してデバッグ スナップショットを取得する

アプリは、left 変数と right 変数を使用して、値のスワップを止める時間をトラックします。left 変数が right 変数よりも大きくなると、ループが終了します。

ソースコード内の条件に基づいてトリガーするようにスナップショットを設定できます。ループが終了するタイミングがわかっているので、条件付きスナップショットで問題を特定できます。

  1. ループが想定以上に実行される理由を調べるには、次の条件でトリガーするようにスナップショットを設定します。left > right。次に、カメラアイコン をクリックして Debugger のスナップショットを準備します。

    条件文で行 47 に設定されたスナップショット。

  2. ページを更新してスナップショットをトリガーします。[変数] ペインに、left 変数が right 変数より大きいことが表示されています。

    ループのこの時点ですでに left 変数が right 変数よりも大きいため、ループが続行され、行 50 に到達して終了する前に、値がもう一度スワップされることを示しています。

    変数の値が表示された [変数] ペイン。

式を使用してデバッグ スナップショットを取得する

Debugger では、スナップショットがトリガーされたときにプログラミング言語の式を取得できます。たとえば、chars[1]chars[2] などの式を使用して、chars 配列にある値を取得できます。

  1. スナップショットがトリガーされたときに式の値を取得するには、[] フィールドに式を記述します。複数の式を入力できます。

    スナップショットがトリガーされると、[変数] ペインの上に式の値が表示されます。

    値「c」と「b」が表示された式フィールドからの結果。

問題の解決

アプリの問題の診断には、スナップショットとログポイントが役立ちます。今回の例では、while ループを終了するステートメント(if left >= right: break)に到達するのが遅く、最後のイテレーションを止められないため、ループが想定以上に繰り返されます。問題を解決するには、if left >= right: break を行 50 から行 47 に移動します。

クリーンアップ

このクイックスタートで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Cloud Console の [プロジェクト] ページに移動します。

  2. プロジェクトの横にある [削除] をクリックします。

  3. プロジェクト名を入力して、シャットダウンされたことを確認します。

次のステップ