debugging 如何在VSCode中为特定的.go文件创建调试配置?

6mzjoqzu  于 2023-11-22  发布在  Vscode
关注(0)|答案(1)|浏览(155)

目前,必须首先在编辑器中聚焦.go文件进行调试,然后按F5键开始调试。
我想要的是,能够按F5开始调试,但不必在编辑器中首先关注main.go
这是VSCode生成的股票配置,在F5之前必须关注.go文件:

{
        "name": "Launch Package",
        "type": "go",
        "request": "launch",
        "mode": "auto",
        "program": "${fileDirname}",
    }

字符串
尝试指定programcwd以使其满意:

{
        "name": "Launch Package",
        "type": "go",
        "request": "launch",
        "mode": "auto",
        "program": "${workspaceFolder}/cmd/sym_dump/main.go",
        "cwd": "${workspaceFolder}/cmd/sym_dump",
    }


但是这不起作用,它会抱怨找不到函数:

Starting: C:\Users\aybe\go\bin\dlv.exe dap --listen=127.0.0.1:49541 from C:\GitHub\psx_mnd_sym/cmd/sym_dump
DAP server listening at: 127.0.0.1:49541
Build Error: go build -o C:\GitHub\psx_mnd_sym\cmd\sym_dump\__debug_bin2780105186.exe -gcflags all=-N -l .\main.go
# command-line-arguments
.\main.go:340:13: undefined: dumpTypes
.\main.go:344:14: undefined: dumpSourceFiles
.\main.go:348:14: undefined: dumpDecls
.\main.go:357:13: undefined: dumpTypes
.\main.go:365:13: undefined: dumpIDAScripts
.\main.go:380:13: undefined: dumpTypes (exit status 1)


实际的函数位于与program相同目录下的另一个.go文件中。
这两个文件都在其顶部指定了package main
在这种情况下,如何为特定的.go文件创建调试配置?

3phpmpom

3phpmpom1#

program属性指定为目录:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch Package",
      "type": "go",
      "request": "launch",
      "mode": "auto",
      "program": "${workspaceFolder}/cmd/sym_dump"
    }
  ]
}

字符串
${fileDirname}是当前打开的文件的文件夹路径。默认的Launch Package模板使用${fileDirname}而不是${file}Launch file模板使用${file})是有原因的。
让我们先看看dlv debug的文档:

简介

...
默认情况下,没有参数,Delve将编译当前目录中的“main”包,并开始调试它。或者,您可以指定一个包名称,Delve将编译该包,并开始一个新的调试会话。

dlv debug [package] [flags]


关于package的信息不多。让我们转向go run的文档:

编译运行Go程序

使用方法:

go run [build flags] [-exec xprog] package [arguments...]


Run编译并运行命名的主Go包。通常包被指定为来自单个目录的.go源文件列表,但它也可以是导入路径,文件系统路径或匹配单个已知包的模式,如'go run .'或'go run my/zh'。
如果我们将program属性指定为${workspaceFolder}/cmd/sym_dump/main.go,这意味着该软件包包含单个文件(main.go)。但事实是,该软件包包含另一个定义dumpTypesdumpSourceFiles等的文件。这就是为什么它无法构建程序。
顺便说一句,由于“如果cwd被省略或为空,程序文件夹将用作工作目录”(参见Launch.json属性),因此您不需要设置cwd属性。

相关问题