3

我到处搜索并尽我所能,但在 VSCODE 中调试 go exe 对我来说真的很奇怪。

如果我单步执行代码,调试器有时似乎会到处乱跳,就好像我在切换线程一样。大多数时候,如果我将鼠标悬停在变量上,什么都不会发生。如果我尝试将它们添加为手表,我只会“不可用”。我正在 IDE 中构建和运行。

我有最新版本的 go and delve。我看到我应该使用一些 gcflags 设置来避免编译器优化,但什么也没做。不知道如何取得进展。有什么线索吗?


更新:毕竟,这只是 VSCODE 使用的构建任务中的一个错字。问题确实是编译器优化,需要使用以下确切语法禁用它:

{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
    {
        "label": "Make Prog",
        "type": "shell",
        "command": "go",
        "args": [
            "install",
            "-gcflags",
            "-N -l",
            "./..."
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },


    }
]

}

相关的是我正在使用“exec”而不是“debug”来调试可执行文件。

4

1 回答 1

4

Delve 使您能够通过控制进程的执行、评估变量以及提供线程/goroutine 状态、CPU 寄存器状态等信息来与您的程序进行交互。

Delve 将编译当前目录中的“主”包,并开始调试它。

对于您的问题:-

如果我单步执行代码,调试器似乎有时会到处乱跳,就好像我在切换线程一样

假设您有一个代码发生错误并且您的代码恐慌,那么 VSCode 将在调试代码时让您跳转到其核心文件中定义的恐慌定义。

对于您的第二个问题:-

大多数时候,如果我将鼠标悬停在变量上,什么都不会发生。如果我尝试将它们添加为手表,我只会“不可用”。

Vs Code 只能为您提供在同一个包中定义的那些函数的定义,因此如果它们在另一个包中定义,则您必须导入该包,否则它将显示unavailable函数定义。因此,请检查unavailable悬停时显示的正确导入。

有关更多信息,请查看Delve 调试器的使用文档

编辑:即使它在使用时跳转F10,在它跳转的代码之后创建断点并使用F12跳转到下一个断点,这样它就不会跳转到核心函数定义。

于 2018-06-28T15:14:46.257 回答