デバッガーで実行中の Go プロセスにアタッチする
GoLand では、ローカルマシン、リモートマシン、Docker コンテナーで実行中の Go プロセスにデバッガーを接続できます。
ローカルマシンのプロセスにアタッチする
コマンドラインから起動したアプリケーションをデバッグできます。この場合、アプリケーションは IDE の外部で実行されますが、同じローカルマシン上で実行されます。アプリケーションをデバッグするには、IDE でプロジェクトを開き、実行中のプロセスにデバッガーをアタッチする必要があります。
例として、github.com にある次の Go コード(英語)を使用できます。
ステップ 1. gops パッケージをインストールする
ターミナルツールウィンドウ( )を開き、次のコマンドを実行します。
go get -t github.com/google/gops/「go get gops」を呼び出すリンクをクリックします。
(Ctrl+Alt+F5)をクリックします。通知ウィンドウで、
ステップ 2. アプリケーションをビルドして実行する
ターミナルツールウィンドウを開き、次のコマンドを実行します。
に移動してgo build -gcflags="all=-N -l" -o myApp.exeこのコマンドは、
myApp.exe
実行可能ファイルをコンパイルし、コンパイラーの最適化とインライン展開を無効にします。コンパイルされた実行可能ファイルを実行します。
.\myApp.exe
ステップ 3. 実行中のプロセスにアタッチしてデバッグする
ブレークポイントを設定するコード行の横にあるガターをクリックします。提供されている例(英語)では、行 23 (
message := fmt.Sprintf("Hello %s!", r.UserAgent())
) にブレークポイントを配置します。ブレークポイントのブレークポイントの詳細については、こちらを参照してください。をクリックするか、ショートカット Ctrl+Alt+F5 を使用します。
デバッガーで接続するウィンドウでアプリケーションプロセスを選択し、Enter を押します。
アプリケーション内のブレークポイントに関連付けられたイベントをトリガーします。提供されているコード例を使用する場合は、ブラウザーで http://localhost:8080/ リンクを開きます。
リモートマシン上のプロセスにアタッチする
リモートコンピューターに接続し、そのコンピューターで実行されている Go プロセスにデバッガーをアタッチできます。リモートデバッガー (Delve) は、リモートコンピューターで実行されている必要があります。
Delve をインストールするには、次のコマンドを使用します。
ステップ 1. リモートコンピューターでアプリケーションを構築する
ターミナルツールウィンドウ( )を開き、次のコマンドを実行します。
go build -gcflags="all=-N -l" -o myApp.exeこのコマンドは、
myApp.exe
実行可能ファイルをコンパイルし、コンパイラーの最適化とインライン展開を無効にします。
ステップ 2. リモートマシンで Delve を実行する
ホストマシンでデバッガーを起動するには、2 つのオプションがあります。
デバッガーがプロセスを実行します。ファイアウォールを使用する場合は、構成で使用されているポート(たとえば、
2345
)を公開します。使用されていない任意のポート番号を使用できます。myApp
は、ステップ 1 で構築された実行可能ファイルの名前です。dlv --listen=:2345 --headless=true --api-version=2 exec ./myAppバイナリに引数をそのまま渡す必要がある場合は、前のコマンドに二重ダッシュ記号(
--
)を追加してから、必要なオプション(-- --config=/path/to/config/file
など)を追加します。プロセスを実行すると、デバッガーは実行中のプロセスに接続します。
<PID>
は、アプリケーションのプロセス識別子です。プロセスにアタッチコマンドを使用して、プロセス ID を取得できます。dlv --listen=:2345 --headless=true --api-version=2 attach <PID>
ステップ 3. ローカルコンピューターでデバッグプロセスを開始する
アプリケーションのコードを開き、ブレークポイントを配置します。提供されているコード例(英語)では、行 23 (
message := fmt.Sprintf("Hello %s!", r.UserAgent())
) にブレークポイントを設定します。ブレークポイントのブレークポイントの詳細については、こちらを参照してください。実行構成の編集を選択します。
をクリックします。または、ツールバーの実行 / デバッグ構成のリストをクリックして、実行 / デバッグ構成ダイアログで、追加ボタン()をクリックし、Go リモートを選択します。
ホストフィールドに、ホスト IP アドレス (たとえば、
localhost
または192.168.1.33
) を入力します。ポートフィールドに、ステップ 2 で構成したデバッガーポート(たとえば、
2345
)を入力します。デバッグをクリックします。
アプリケーションのブレークポイントでイベントをトリガーします。提供されているコード例(英語)を使用した場合は、ブラウザーで
http://<host_address>:8080/
リンクを開きます。次のビデオには 2 つの IDE インスタンスがあります。ダークテーマを使用している IDE はローカルコンピューターであり、ライトテーマを使用している IDE はリモートコンピューターです。
Docker コンテナー内のプロセスにアタッチする
Docker コンテナー内で実行される Go プロセスにデバッガーをアタッチできます。Docker の詳細については、Docker を参照してください。
例として、この Go アプリケーション(英語)には次の Dockerfile (英語) を使用できます。
ステップ 1. Dockerfile 構成を作成する
実行構成の編集を選択します。
をクリックします。または、ツールバーの実行 / デバッグ構成のリストをクリックして、実行 / デバッグ構成ダイアログで、追加ボタン()をクリックし、 を選択します。
Dockerfile フィールドで、参照アイコン()をクリックし、ファイルブラウザーで Dockerfile に移動します。このセクションの例を使用する場合は、この Dockerfile(英語) に移動します。
「コンテナー名」フィールドに、コンテナー名(たとえば、
debugging-tutorial
)を入力します。実行 / デバッグ構成ダイアログで、変更をクリックし、バインドポートと実行オプションを選択します。
バインドポートフィールドで、参照 () をクリックします。
ポートバインディングダイアログで、追加ボタン () をクリックします。ホストポート列に、
8080
と入力します。コンテナーポート列をクリックし、8080
と入力します。さらに、ポート40000
に同じバインドを作成します。実行オプションフィールドで、Docker のコマンドラインオプションを指定します。Dockerfile で提供されている例では、セキュリティプロファイル(英語)を無効にして、
SYS_PTRACE
Linux 機能(英語)を追加します。--security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE実行をクリックします。
ステップ 2. Go リモート実行 / デバッグ構成を作成する
実行構成の編集を選択します。
をクリックします。または、ツールバーの実行 / デバッグ構成のリストをクリックして、実行 / デバッグ構成ダイアログで、追加ボタン()をクリックし、Go リモートを選択します。
ホストフィールドに、ホストの IP アドレスを入力します(例:
localhost
)。ポートフィールドに、構成したデバッガーポートを入力します。この例では、
40000
です。OK をクリックします。
ステップ 3. デバッグプロセスを開始する
サービスツールウィンドウ( )で、 を展開します。作成されたコンテナーが実行中であり、事前構成されたデバッガーポートをリッスンしていることを確認します。
ブレークポイントを配置するには、コード行の近くのガターをクリックします。例: 提供されているコード例(英語)では、行 23 (
message := fmt.Sprintf("Hello %s!", r.UserAgent())
) にブレークポイントを配置します。ブレークポイントのブレークポイントの詳細については、こちらを参照してください。
ツールバーの実行 / デバッグ構成のリストから、作成した Go リモート構成を選択し、デバッグ <構成名> ボタン () をクリックします。または、Alt+Shift+F9 を押して、作成した Go リモート構成を選択します。
アプリケーションのブレークポイントでイベントをトリガーします。提供されているコード例(英語)を使用した場合は、ブラウザーで http://localhost:8080/ を開きます。
次のビデオでは、コンテナーを実行し、リモート実行 / デバッグ構成を作成し、デバッグのためにコンテナーに接続する方法を説明します。
生産性のヒント
リモートプロセスを終了する
Ctrl+F2 を押すと、リモートデバッグセッション中にリモートプロセスを終了できます。プロセスを終了したときに、プロセスに再接続できないことに注意してください。
関連ページ:
ブレークポイント
ブレークポイントは、特定のポイントでプログラムの実行を一時停止する特別なマーカーです。これにより、プログラムの状態と動作を調べることができます。ブレークポイントは、たとえば、特定のコード行に到達したときにプログラムを一時停止するなどの単純なものから、追加の条件をチェックしたり、ログに書き込んだりするなどのより複雑なロジックを含むものまであります。ブレークポイントは、一度設定すると、一時的なブレークポイントを除き、明示的に削除するまでプロジェクト内に残ります。ブレークポイントの種類:GoLand
Docker
Docker は、分離された再現可能な環境で実行可能ファイルをデプロイおよび実行するためのツールです。これは、たとえば、本番環境と同じ環境でコードをテストする場合に役立ちます。GoLand は Docker 機能を統合し、Docker イメージの作成、Docker コンテナーの実行、Docker Compose アプリケーションの管理、パブリックおよびプライベート Docker レジストリの使用など、IDE から直接実行するための支援を提供します。Docker プラグインを有効にするこの機能は、デ...
Mozilla rr を使用したデバッグ
Mozilla rr は、アプリケーションの記録、再生、デバッグに使用できるツールです。Mozilla rr の主なアイデアは、自明ではないバグを見つけるのを手助けすることです。Mozilla rr は、プログラム全体の実行を記録します。これは、プログラムが実行を終了したときにのみ、記録されたトレースをデバッグできることを意味します。サーバーおよびその他の長時間実行アプリケーションの場合、実行中のアプリケーションを終了する必要があります(たとえば、コンソールから SIGTERM シグナルを送信す...