デバッガーで実行中の 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 のバージョンに応じて次のコマンドを実行します。
1.10 以降に移動します。
go build -gcflags="all=-N -l" -o myApp1.9 以前を実行します。
go build -gcflags="-N -l" -o myApp
このコマンドは、
myApp
実行可能ファイルをコンパイルし、コンパイラーの最適化とインライン展開を無効にします。コンパイルされた実行可能ファイル(
./myApp
など)を実行します。
ステップ 3. 実行中のプロセスにアタッチしてデバッグする
コード行の近くのガターをクリックして、ブレークポイントを配置します。例: 提供されているコード例(英語)では、23 行目(
message := fmt.Sprintf("Hello %s!", r.UserAgent())
)にブレークポイントを設定します。ブレークポイントのブレークポイントの詳細を参照してください。Ctrl+Alt+F5 をクリックします。
デバッガーで接続するウィンドウでアプリケーションプロセスを選択し、Enter を押します。
アプリケーションのブレークポイントでイベントをトリガーします。提供されているコード例(英語)を使用した場合は、ブラウザーで
http://localhost:8080/
リンクを開きます。
リモートマシン上のプロセスにアタッチする
リモートコンピューター(ホスト)に接続し、ホストで実行される Go プロセスにデバッガーをアタッチできます。リモートデバッガー(Delve)がリモートコンピューターで実行されている必要があります。
ステップ 1. ホストマシンでアプリケーションをビルドする
$GOPATH
アプローチを使用する場合、プロジェクトがホストマシンとクライアントマシンの$GOPATH
への同じ相対パスでコンパイルされていることを確認してください。例: ホスト上のアプリケーションのコードが$GOPATH/src/debuggingTutorial/
にある場合。クライアントのコードは同じディレクトリ($GOPATH/src/debuggingTutorial/
)にある必要があります。ターミナルツールウィンドウ( )を開き、Go のバージョンに応じて次のコマンドを実行します。
1.10 以降に移動します。
go build -gcflags="all=-N -l" -o myApp1.9 以前を実行します。
go build -gcflags="-N -l" -o myApp
このコマンドは、
myApp
実行可能ファイルをコンパイルし、コンパイラーの最適化とインライン展開を無効にします。
ステップ 2. ホストマシンで Delve を実行する
ホストマシンでデバッガーを起動するには、2 つのオプションがあります。
デバッガーがプロセスを実行します。ファイアウォールを使用する場合は、構成で使用されているポート(たとえば、
2345
)を公開します。使用されていない任意のポート番号を使用できます。myApp
は、ステップ 1 で構築された実行可能ファイルの名前です。dlv --listen=:2345 --headless=true --api-version=2 exec ./myAppバイナリに引数をそのまま渡す必要がある場合は、前のコマンドに二重ダッシュ記号(
--
)を追加してから、必要なオプション(-- --config=/path/to/config/file
など)を追加します。プロセスを実行すると、デバッガーは実行中のプロセスに接続します。
<PID>
は、アプリケーションのプロセス識別子です。プロセスに接続コマンドを使用して、プロセス ID を取得できます。run dlv --listen=:2345 --headless=true --api-version=2 attach <PID>
ステップ 3. クライアントコンピューターで Go リモート実行 / デバッグ構成を作成する
実行構成の編集を選択します。
をクリックします。または、ツールバーの実行 / デバッグ構成のリストをクリックして、実行 / デバッグ構成ダイアログで、追加ボタン(
)をクリックし、Go リモートを選択します。
ホストフィールドに、ホストの IP アドレスを入力します(例:
192.168.1.33
)。ポートフィールドに、ステップ 2 で構成したデバッガーポート(たとえば、
2345
)を入力します。OK をクリックします。
ステップ 4. クライアントコンピューターでデバッグプロセスを開始する
コード行の近くのガターをクリックして、ブレークポイントを配置します。例: 提供されているコード例(英語)では、23 行目(
message := fmt.Sprintf("Hello %s!", r.UserAgent())
)にブレークポイントを設定します。ブレークポイントのブレークポイントの詳細を参照してください。ツールバーの実行 / デバッグ構成のリストから、作成された Go リモート構成を選択し、デバッグ <構成名> ボタン(
)をクリックします。または、Alt+Shift+F9 を押して、作成された Go リモート構成を選択します。
アプリケーションのブレークポイントでイベントをトリガーします。提供されているコード例(英語)を使用した場合は、ブラウザーで
http://<host_address>:8080/
リンクを開きます。
Docker コンテナー内のプロセスにアタッチする
Docker コンテナーで実行される Go プロセスにデバッガーをアタッチできます。Docker の詳細については、Docker を参照してください。
例として、この Go アプリケーションに (英語) 次の Dockerfile(英語) を使用できます。 Dockerfile と main.go を $GOPATH/src/debuggingTutorial に保存します。 Dockerfile は debuggingTutorial ディレクトリを使用することに注意してください。プロジェクトに別のディレクトリを使用する場合は、Dockerfile のディレクトリ名を変更してください。
ステップ 1. Dockerfile 構成を作成する
実行構成の編集を選択します。
をクリックします。または、ツールバーの実行 / デバッグ構成のリストをクリックして、実行 / デバッグ構成ダイアログで、追加ボタン(
)をクリックし、 を選択します。
Dockerfile フィールドで、参照アイコン(
)をクリックし、ファイルブラウザーで Dockerfile に移動します。このセクションの例を使用する場合は、この Dockerfile(英語) に移動します。
コンテナー名フィールドにコンテナー名を入力します (たとえば、
debugging-tutorial
)バインドポートフィールドで、参照アイコン(
)をクリックします。追加ボタン(
)をクリックします。ホストポート列に
8080
と入力します。コンテナーポート列をクリックし、8080
と入力します。また、ポート40000
に同じバインディングを追加します。実行オプションフィールドで、Docker のコマンドラインオプションを指定します。Dockerfile で提供されている例では、セキュリティプロファイル(英語)を無効にして、
SYS_PTRACE
Linux 機能(英語)を追加します。--security-opt="apparmor=unconfined" --cap-add=SYS_PTRACEOK をクリックします。
ステップ 2. Dockerfile 構成を実行する
ツールバーの実行 / デバッグ構成のリストから、作成された Dockerfile 構成を選択し、<configuration_name> を実行しますボタン(
)をクリックします。
ステップ 3. Go リモート実行 / デバッグ構成を作成する
実行構成の編集を選択します。
をクリックします。または、ツールバーの実行 / デバッグ構成のリストをクリックして、実行 / デバッグ構成ダイアログで、追加ボタン(
)をクリックし、Go リモートを選択します。
ホストフィールドに、ホストの IP アドレスを入力します(例:
localhost
)。ポートフィールドに、構成したデバッガーポートを入力します。提供されている例では、
40000
です。OK をクリックします。
ステップ 4. デバッグプロセスを開始する
サービスツールウィンドウ( )で、 を展開します。作成されたコンテナーが実行中であり、事前構成されたデバッガーポートをリッスンしていることを確認します。
コード行の近くのガターをクリックして、ブレークポイントを配置します。例: 提供されているコード例(英語)では、23 行目(
message := fmt.Sprintf("Hello %s!", r.UserAgent())
)にブレークポイントを設定します。ブレークポイントのブレークポイントの詳細を参照してください。ツールバーの実行 / デバッグ構成のリストから、作成された Go リモート構成を選択し、デバッグ <構成名> ボタン(
)をクリックします。または、Alt+Shift+F9 を押して、作成された Go リモート構成を選択します。
アプリケーションのブレークポイントでイベントをトリガーします。提供されているコード例(英語)を使用した場合は、ブラウザーで
http://localhost:8080/
リンクを開きます。
生産性のヒント
リモートプロセスを終了する
Ctrl+F2 を押すと、リモートデバッグセッション中にリモートプロセスを終了できます。プロセスを終了したときに、プロセスに再接続できないことに注意してください。
関連ページ:

ブレークポイント
ブレークポイントは、特定のポイントでプログラムの実行を一時停止する特別なマーカーです。これにより、プログラムの状態と動作を調べることができます。ブレークポイントは、単純な場合(たとえば、コード行に到達したときにプログラムを一時停止する場合)や、より複雑なロジック(追加の条件に対するチェック、ログメッセージの書き込みなど)を伴う場合があります。一度設定すると、ブレークポイントは、一時的なブレークポイントを除いて、明示的に削除するまでプロジェクトに残ります)。ブレークポイントを持つファイルが外部で変...

Docker
Docker を使用すると、開発者は、本番環境と同じ環境でコードをテストするために、コンテナー内にアプリケーションをデプロイできます。GoLand は、Docker プラグインを使用して Docker サポートを提供します。プラグインはバンドルされており、デフォルトで有効になっています。Docker サポートを有効にする Docker をインストールして実行します。詳しくは、Docker のドキュメントを参照してください。Docker デーモンの接続設定を構成します。設定 / 環境設定ダイアログで、...

プロファイラーラベルの使用
ゴルーチンは、他の関数またはメソッドと同時に実行される関数またはメソッドです。ゴルーチンを作成するには、キーワードに続けて関数呼び出しを使用します(たとえば、)。ただし、多数のゴルーチンを使用すると、プログラムのデバッグが困難になります。ゴルーチンを区別するために、ゴルーチンにカスタムデータのラベルを付けることができます。Go 1.9 以降、追加の情報を記録して、実行パスに関するより多くのコンテキストを提供できます。ラベルのセットをプロファイリングデータの一部として記録し、後でこれらのラベルを使...

アプリケーションをデプロイする
GoLand は、すべての開発、デバッグ、テストがコンピューター上で行われたことを前提としており、コードは実稼働環境にデプロイされています。この「ローカル開発 - デプロイ」モデルに固執する理由は、GoLand がコード補完、コードインスペクション、コードナビゲーション、その他のコーディング支援機能を提供する方法にあります。この機能はすべて、プロジェクトのロード時に GoLand がビルドし、コードの編集時にその場で更新されるプロジェクトファイルインデックスに基づいています。効率的なコーディング...