go - 调试golang可执行文件时无法在vscode中获取局部变量

标签 go visual-studio-code vscode-debugger

我在 Golang 中创建了一个示例项目:

sampleapp/
sampleapp/main.go

其中有以下代码:

package main

import (
    "flag"
    "fmt"
)

func main() {
    var name = flag.String("name", "user1", "user name")
    var age = flag.Int("age", 20, "user age")
    fmt.Println(*name)
    fmt.Println(*age)
}

我关注了https://code.visualstudio.com/docs/editor/debugging并创建了以下 launch.json

 {
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch file",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/main.go",
            "env": {},
            "args": []
        },
        {
            "name": "Launch exec",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "program": "${workspaceFolder}/sampleapp",
            "env": {},
            "args": []
        }
    ]
}

当我使用 Launch File Debug模式在 main 上设置断点时 - 我能够单步执行程序并可以看到 usernameage 的值如下:

enter image description here

但是当我像这样在构建应用程序后使用Launch exec Debug模式时:

go build

我可以单步执行代码,但 Local 部分挂起,旋转器持续运行并且不显示任何局部变量,如下所示:

enter image description here

我必须执行重新加载窗口 以摆脱挂起的本地变量微调器。我检查了 vscode 问题并看到了 https://github.com/microsoft/vscode-go/issues/2444但在那种情况下,当出现 panic 时,变量不会显示。但就我而言,我只是打印 2 个变量。

我认为这可能是我的 dlv 安装的问题,但是当我使用 dlv 和可执行文件进行调试时,我能够获取值(从中删除不必要的行dlv 输出):

dlv exec sampleapp
Type 'help' for list of commands.
(dlv) break main.main
Breakpoint 1 set at 0x109e1f3 for main.main() ./main.go:8
(dlv) s
> main.main() ./main.go:8 (hits goroutine(1):1 total:1) (PC: 0x109e1f3)
Warning: debugging optimized function
     3: import (
     4:         "flag"
     5:         "fmt"
     6: )
     7:
=>   8: func main() {
     9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
    11:         fmt.Println(*name)
    12:         fmt.Println(*age)
    13: }
(dlv) s
> main.main() ./main.go:9 (PC: 0x109e202)
Warning: debugging optimized function
     4:         "flag"
     5:         "fmt"
     6: )
     7:
     8: func main() {
=>   9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
    11:         fmt.Println(*name)
    12:         fmt.Println(*age)
    13: }
(dlv) s
> main.main() ./main.go:11 (PC: 0x109e29f)
Warning: debugging optimized function
     6: )
     7:
     8: func main() {
     9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
=>  11:         fmt.Println(*name)
    12:         fmt.Println(*age)
    13: }
(dlv) stepout
user1
> main.main() ./main.go:12 (PC: 0x109e31a)
Warning: debugging optimized function
     7:
     8: func main() {
     9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
    11:         fmt.Println(*name)
=>  12:         fmt.Println(*age)
    13: }
(dlv) p name
*"user1"
(dlv) p age
*20

我在这里缺少一些非常基本的东西吗?

最佳答案

最初我可以重现您的问题,但在我升级到 VSCode 版本 1.35.1 后(我在 MacOSX 上),问题就消失了。我可以在调试期间使用“Launch exec”查看变量值

我认为编译器优化使其成为问题。对于使用构建的可执行文件应该工作正常 go build -gcflags=all="-N -l"

-N:禁用优化 -l:禁用内联

Golang 官方也建议:https://golang.org/doc/gdb

关于go - 调试golang可执行文件时无法在vscode中获取局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56414356/

相关文章:

dictionary - 比较GO中 map 的值(value)

c# - VSCode 发生异常 : CLR/System. ApplicationException

sqlite - 有没有办法通过 WSL2 以可视方式 (GUI) 探索 SQLite DB?

Angular js 4 与 VS Code 在 powershell 中的 npm start 命令上显示错误

javascript - 语法错误 : Cannot use import statement outside a module

go - Negroni:将上下文从中间件传递到处理程序

xml - 在 Go 中解码 XML 元素的异构列表

mysql - golang sql查询超时

javascript - debug.activeDebugSession API 在 vscode 上返回未定义

python - VS 代码调试器立即退出