如何为Golang和AppEngine设置VScode调试会话?

24

VScodeDebugGoAppEngine

本教程展示如何使用Visual Studio(也称为VScode)设置VS Code以调试Golang App Engine代码的Hello World程序。

这是使用来自AppEngine文档的Helloworld代码:

go get -u -d github.com/directmeasure/VScodeDebugGoAppEngine.git

在运行osX 10.13.3的Mac上,我已经测试了该代码并且服务器可以在本地工作。我正在尝试找出如何使用调试器进入代码,以便我可以学习如何在其他项目中使用调试器。
这是我能找到的最好的使用VScode与GAE配合使用的说明,但它们似乎已经过时了,因为Golang已经更新了(例如转换到Gcloud、-go_debugging标志和目录结构的更改):
https://medium.com/@dbenque/debugging-golang-appengine-module-with-visual-studio-code-85b3aa59e0f 以下是我采取的步骤:

设置环境

  • added to .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的第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

EDIT###########################

$ 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

1
你应该切换开发者工具并查看控制台是否显示任何异常,有时运行进度条意味着在VSCode的JS代码中存在异常。 - Tarun Lalwani
我相信 Tyler 的答案可以解决这个问题。请检查并更新。 - Tarun Lalwani
2个回答

15

VS Code无法连接到Delve,因为它在等待连接到远程Delve服务器,位于127.0.0.1:2345。如果您以无头模式侦听正确的地址并执行dlv attach,希望您能够连接。

以下步骤描述了如何调试使用dev_appserver.py运行而没有其他工具/助手的Go App Engine应用程序。但是,当您更改Go代码时,dev_appserver.py会重新编译和重启应用程序,从而更改了Delve需要调试的PID。 http://github.com/dbenque/delveAppengine 可以帮助将Delve附加到正确的进程。有关教程,请参见此处

  1. 安装VS Code Go扩展程序
  2. go get -u -d github.com/directmeasure/VScodeDebugGoAppEngine.git
  3. cd $GOPATH/src/src/github.com/GoogleCloudPlatform/golang-samples/appengine/helloworld

    注意:如果您的GOPATH有多个条目,请cdgo get下载的目录。

  4. 启动App Engine开发服务器:

    dev_appserver.py --go_debugging=true app.yaml

  5. 访问 http://localhost:8080 确保服务器正在运行。
  6. 查找Go进程的PID:

    ps aux | grep _go_app

  7. 启动Delve服务器(选择系统上任何可用端口):

    dlv --headless -l "localhost:2345" attach $GO_APP_PID

  8. 打开VS Code的调试选项卡(macOS上为⇧⌘D,在Windows和Linux上为Ctrl+Shift+D)。
  9. 通过点击齿轮并选择任何条目(请参阅官方文档)创建一个新的启动配置。
  10. 创建“Go: Connect to server”条目:create config dropdown

    注意:这只是一个模板-您稍后可以编辑它。

  11. 自定义配置以指向您启动Delve时指定的端口。这是我的完整配置:

    {
        "name": "Launch",
        "type": "go",
        "request": "launch",
        "mode": "debug",
        "remotePath": "",
        "port": 2345,
        "host": "127.0.0.1",
        "program": "${fileDirname}",
        "env": {},
        "args": [],
        "showLog": true
    }
    
  12. 根据需要添加断点,并再次访问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 无头服务器中分配的端口相同吗? - BryanWheelock
是的,你说得对。我编辑了帖子以更正端口。 - Tyler B
文件显示无界面的 Delve 服务器分配的端口应该与 launch.js 中的端口配置匹配,但这会导致绑定错误。当我更改配置中的端口时,调试 REPL 显示 API 服务器正在侦听,但调试器仍然不显示变量。 - BryanWheelock
dlv --headless -l "localhost:2345" attach 中指定的端口应该与配置中的 "port": 2345, 行完全匹配。我建议在启动所有内容之前检查 lsof -n -i :2345lsof -n -i :8080(或您尝试使用的任何端口)以确保一切都清晰明了。 - Tyler B
我在连接Delve之前检查了端口2345没有被占用,但仍然出现绑定错误。请查看上面的编辑。 - BryanWheelock

1
是的,它已经过时了。您正在访问的页面不存在。相反,您可以运行。
go get github.com/GoogleCloudPlatform/golang-samples/tree/master/appengine/helloworld/...

问题不在于获取HelloWorld代码。我已经下载了helloworld代码。它能正常运行。但我无法弄清如何启动调试器。 - BryanWheelock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接