如何为 Golang 和 AppEngine 设置 VScode 调试会话?
Posted
技术标签:
【中文标题】如何为 Golang 和 AppEngine 设置 VScode 调试会话?【英文标题】:How do I setup VScode debug session for Golang and AppEngine? 【发布时间】:2018-08-26 01:12:09 【问题描述】:VScodeDebugGoAppEngine
展示如何设置 VS Code 以使用 Visual Studio(又名 VScode)调试 Golang App Engine 代码的 Hello World 教程
这是使用 AppEngine 文档中的 Helloworld 代码:
go get -u -d github.com/directmeasure/VScodeDebugGoAppEngine.git
在运行 osX 10.13.3 的 Mac 上。
我已经测试了代码并且服务器在本地工作。我正在尝试弄清楚如何使用调试器输入代码,以便了解如何在其他项目中使用调试器。
这些是我能找到的在 GAE 中使用 VScode 的最佳说明,但它们似乎已经过时,基于对 Golang 的更新(例如切换到 Gcloud、-go_debugging 标志和更改目录结构):https://medium.com/@dbenque/debugging-golang-appengine-module-with-visual-studio-code-85b3aa59e0f
这是我采取的步骤:
设置环境
添加到 .bash_profile
export BASEFOLDER="/Users/Bryan/google-cloud-sdk/" .
export GOROOT="/usr/local/go" # this shoudln't have to be set with current Version, doing it to follow the tutorial .
我如何尝试让调试器运行:
启动本地服务器。
dev_appserver.py --go_debugging=true app.yaml
将本地二进制文件附加到 Delve
ps aux | grep _go_app
dlv attach <#using the PID from the server binary>
Delve 成功附加到二进制文件。
当我启动调试会话时,蓝色进度条从未停止水平扫描。
VARIABLE 侧边栏永远不会填充 hello.go 中的变量
断点设置在 hello.go: line 21
Debug REPL 终端显示:
Verbose logs are written to:
/var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/vscode-go-debug.txt
16:02:31, 2018-4-5
InitializeRequest
InitializeResponse
Using GOPATH: /Users/Bryan/go
fmt.Print(u)
Please start a debug session to evaluate
这是 launch.json 配置:
"version": "0.2.0",
"configurations": [
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
//"port": 1234,
"port": 2345 // docs say port should match assigned port headless server, https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code#remote-debugging
// this creates bind error
"host": "127.0.0.1",
"program": "$workspaceFolder/hello.go",
"env": ,
"args": [],
"showLog": true,
"trace": true,
]
这是我安装的版本:
go version go1.10 darwin/amd64
$ gcloud version .
Google Cloud SDK 197.0.0
app-engine-go
app-engine-python 1.9.68
bq 2.0.31
core 2018.04.06
gsutil 4.30
VS code extension:
Go 0.6.78
编辑###########################
$ lsof -n -i :8080
Bryan@Bryans-MacBook-Pro Thu Apr 12 17:02:04 ~
$ lsof -n -i :2345
Bryan@Bryans-MacBook-Pro Thu Apr 12 17:03:34 ~
$ ps aux | grep _go_app
Bryan 7433 0.0 0.0 2434840 800 s000 S+ 5:03PM 0:00.00 grep _go_app
Bryan 7426 0.0 0.0 556603172 3896 s002 S+ 5:02PM 0:00.01 /var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmp8GWk1gappengine-go-bin/_go_app
Bryan@Bryans-MacBook-Pro Thu Apr 12 17:03:52 ~
$ dlv attach --headless -l "localhost:2345" 7426 /var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmp8GWk1gappengine-go-bin/_go_app
API server listening at: 127.0.0.1:2345
当我启动调试器时,REPL 显示:
Verbose logs are written to:
/var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/vscode-go-debug.txt
couldn't start listener: listen tcp 127.0.0.1:2345: bind: address already in use
Process exiting with code: 1
【问题讨论】:
你应该切换开发者工具,看看控制台是否显示异常,有时运行进度条意味着VSCode的JS代码有异常 我相信 Tyler 的回答应该可以做到。请检查并更新 【参考方案1】:VS Code 永远不会附加到 Delve,因为它正在等待连接到位于 127.0.0.1:2345
的远程 Delve 服务器。如果你 dlv attach
在无头模式下,在正确的地址上监听,你应该能够连接。
以下步骤描述了如何调试使用 dev_appserver.py
运行且不使用其他工具/帮助程序的 Go App Engine 应用程序。但是,当您对 Go 代码进行更改时,dev_appserver.py
会重新编译并重新启动应用程序,更改 PID Delve 需要调试。 http://github.com/dbenque/delveAppengine 可以帮助 Delve 与正确的流程保持联系。教程见here。
-
安装VS Code Go extension。
go get -u -d github.com/directmeasure/VScodeDebugGoAppEngine.git
cd $GOPATH/src/src/github.com/GoogleCloudPlatform/golang-samples/appengine/helloworld
注意:如果你的 GOPATH 有多个条目,cd
到目录go get
下载到。
启动 App Engine 开发服务器:
dev_appserver.py --go_debugging=true app.yaml
查找Go进程的PID:
ps aux | grep _go_app
启动 Delve 服务器(选择系统上的任何可用端口):
dlv --headless -l "localhost:2345" attach $GO_APP_PID
创建一个“Go:连接到服务器”条目:
注意:这只是一个模板 - 您可以稍后对其进行编辑。
自定义配置以指向您在启动 Delve 时指定的端口。这是我的完整配置:
“名称”:“启动”, “类型”:“去”, “请求”:“启动”, “模式”:“调试”, “远程路径”:“”, “端口”:2345, “主机”:“127.0.0.1”, "程序": "$fileDirname", “环境”:, “参数”:[], “showLog”:真 根据需要添加断点并再次访问http://localhost:8080。到达断点时应停止执行,变量应列在 VS Code 的变量部分中,调用堆栈应位于调用堆栈部分。有关在 VS Code 中调试 Go 代码(不与 App Engine 一起运行)的一般帮助,请参阅https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code。
【讨论】:
launch.json中的端口不应该和Delve无头服务器中分配的端口相同吗? 是的。你说得对。我编辑了帖子以更正端口。 文档说无头 Delve 服务器分配的端口应该与 launch.js 中的端口配置匹配,但这会产生绑定错误。当我在配置中更改端口时,Debug REPL 显示 API 服务器正在侦听,但调试器 sill 不显示变量。dlv --headless -l "localhost:2345" attach
中指定的端口必须与配置中的"port": 2345,
行匹配。我建议检查lsof -n -i :2345
和lsof -n -i :8080
(或您尝试使用的任何端口)以确保在启动之前一切都清楚。
我在附加 Delve 之前检查了端口 2345 是否未使用,但仍然出现绑定错误。请参阅上面的编辑。【参考方案2】:
是的,它已经过时了。您从中获取的页面不存在。相反,您可以运行
go get github.com/GoogleCloudPlatform/golang-samples/tree/master/appengine/helloworld/...
【讨论】:
问题是没有得到 Helloworld 代码。我已经下载了 helloworld 代码。有用。我不知道如何启动调试器。以上是关于如何为 Golang 和 AppEngine 设置 VScode 调试会话?的主要内容,如果未能解决你的问题,请参考以下文章
如何为我的App Engine应用设置自定义npm启动脚本?