環境構成
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
: 外部サーバーによって実行される進行中のデバッグ セッションに接続します。
モード タイプ構成を使用して、すでに実行中のプログラムをデバッグできますlocal
。Go 拡張機能が起動し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": {
},