vscode は delve を使用して golang プログラムをデバッグします

環境構成

Delve ウェアハウス (チュートリアルを含む): https://github.com/go-delve/delve

Golang デバッグ チュートリアル: https://github.com/golang/vscode-go/wiki/debugging

> go version
go version go1.20 windows/amd64

> go install github.com/go-delve/delve/cmd/dlv@latest

ショートカットキー

F8 下一步

F7 进入函数
Shift+F8 退出函数

F9 下一个断点

golang には 3 つのデバッグモードがあります

1、起動パッケージ
// Launch package: Debug/test the package of the open file 
{
    
    
    "name": "Launch Package",
    "type": "go",
    "request": "launch",
    "mode": "auto",
    "args": ["new", " conda"],
    "program": "${fileDirname}"
}

説明からわかるように、これは現在開いているファイルがデバッグされるパッケージであるため、現在開いているファイルは、メイン関数を含むメイン パッケージ、またはテスト ファイル、つまり実行可能なファイルである必要があります。直接実行されます。同様に、実行するディレクトリに直接入力します。go run

実行パラメータの引数を持ち込むことができます

テストプログラム

ctl/
	ctl.go
package main

import (
	"fmt"
	"voteapi/ctl/cmd"
)

func main() {
    
    
	fmt.Println("xxx")
	cmd.Execute()
}

デバッガは最初のブレークポイントに直接ジャンプするため、ブレークポイントを設定しますfmt.Println("xxx")。ブレークポイントがない場合は、直接終了します。

コンソール出力

Starting: D:\dev\php\magook\trunk\server\golang\path\bin\dlv.exe dap --listen=127.0.0.1:20155 from D:\dev\php\magook\trunk\server\voteapi\ctl
DAP server listening at: 127.0.0.1:20155
Type 'dlv help' for list of commands.

modeパラメータ値

  • debug: メインパッケージをビルドしてデバッグします
  • test: テストのビルドとデバッグ
  • exec: プリコンパイルされたバイナリをデバッグします
    • go build -gcflags=all="-N -l"デバッグを妨げる可能性があるインライン化と最適化を無効にするためにバイナリをビルドする必要があります。
  • auto:開いているファイルに応じてdebugとの間で自動的に選択しますtest
2、プロセスにアタッチ
// Attach to local process: Attach to an existing process by process ID
{
    
    
    "name": "Attach to Process",
    "type": "go",
    "request": "attach",
    "mode": "local",
    "processId": 0
}

アタッチ: この構成を使用して、実行中のプロセスまたは実行中のデバッグ セッションにアタッチできます。

modeパラメータ値

  • local: ローカルプロセスに接続します。
    • go build -gcflags=all="-N -l"デバッグを妨げる可能性があるインライン化と最適化を無効にするためにバイナリをビルドする必要があります。
  • remote: 外部サーバーによって実行される進行中のデバッグ セッションに接続します。

モード タイプ構成を使用して、すでに実行中のプログラムをデバッグできますlocalGo 拡張機能が起動しdlv dap、指定されたプロセスに接続するように構成されます。ユーザーは、次のいずれかのオプションを使用して、デバッグするプロセスを選択できます。

  • 属性を使用して数値プロセス ID (PID) を指定しますprocessId
  • 属性に対象プログラム名を指定しますprocessId指定されたプログラム名に一致するプロセスが複数ある場合、拡張機能はデバッグ セッションの開始時に一致するプロセスのリストを表示します。
  • 0属性で指定しprocessId、デバッグ セッションの開始時にドロップダウン メニューからプロセスを選択します。

アタッチのローカル モードのアプリケーション シナリオは、http サーバーなどのメモリ常駐プログラムです。プログラムをコンパイルして実行した後、VScode に進み、主に processId 属性を構成します。これには、プロセス ID、プロセス名、または0 を選択し、編集します。ブラウザには、添付するプログラムを選択するためのドロップダウン ボックスが表示されます。

たとえば、まだ ctl.go ファイルがある場合は、それを変更します

package main

import (
	"fmt"
	"net/http"
)

func main() {
    
    
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    
    
		fmt.Fprintf(w, "%s", "hello")
	})
	http.ListenAndServe(":9999", nil)
}
go build ctl.go
ctl.exe

Attach to Processデバッグを開始するには、[デバッグの実行] 三角ボタンをクリックし、ポップアップ ドロップダウン ボックスに入力することを選択しますctl.exe。同様に、最初にいくつかのブレークポイントを設定する必要があります。

ここに画像の説明を挿入します

デバッグツールバーは次のようになります

ここに画像の説明を挿入します

一時停止状態ですが、ブラウザでこのサービスをリクエストするとアクティブ化され、段階的にデバッグできるようになります。

ここに画像の説明を挿入します

リクエストがデバッグされた後、デバッグは終了せずに一時停止され、次のリクエストがトリガーされるまで待機します。

3、サーバーに接続します

手順 https://github.com/golang/vscode-go/wiki/debugging#remote-debugging

これは vscode のリモート デバッグ機能です。リモート開発、つまりリモート開発とリモート デバッグに基づいています。これには、リモート コードをローカルにマップするために追加の vscode 拡張機能のインストールも必要です。その後、ローカル コードをプッシュできます。時々リモートサーバーに送信し、最後にリモートサーバーでコードを実行します。

ここに直接来て、デバッグできることがわかりました。

package main

import (
	"fmt"
	"voteapi/ctl/cmd"
)

func main() {
    
    
	fmt.Println("xxx")
	cmd.Execute()
}
// Connect to server: Connect to a remote headless debug server
{
    
    
    "name": "Connect to server",
    "type": "go",
    "debugAdapter": "dlv-dap",
    "request": "attach",
    "mode": "remote",
    "remotePath": "${workspaceFolder}",
    "port": 2345,
    "host": "127.0.0.1"
}
dlv debug --headless --listen=:2345

launch.json 設定項目

ドキュメント https://github.com/golang/vscode-go/wiki/debugging#configuration

// 命令行参数,要自己打空格
"args": ["-config", " server.json"],

// 编译参数
"buildFlags": "-tags 'server'",

// key:value
"env": {
    
    },

おすすめ

転載: blog.csdn.net/raoxiaoya/article/details/132695561