Visual Studio Code Go 调试:无法启动进程:不是可执行文件

12

我之前在VSCode中可以正常运行和调试GO代码,但在进行了VSCode内部更新后,现在无法进行调试并一直出现这个错误:

could not launch process: not an executable file
Process exiting with code: 1

配置:

go version
go version go1.15.5 windows/amd64

 dlv version
Delve Debugger
Version: 1.6.0


set GOPATH=C:\Users\foo\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=c:\go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=c:\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\FOO~1\AppData\Local\Temp\go-build049073490=/tmp/go-build -gno-record-gcc-switches
PS C:\Dev\my\go\tests>

这里输入图片描述 我不理解更新出了什么问题?


1
Go这样的编程语言的调试器主要依赖于Launch.json设置,它将插入正确的调试器以进行中断,请检查Launch.json中的设置是否大多不正确。 - Mrinal Kamboj
1
请发布您的 launch.json 文件。 - Thamaraiselvam
3
也许你已经有了 launch.json 文件,但 main.go 需要保持打开状态,如果你打开了另一个文件, 测试将显示这个错误信息。 - Jsperk
最终,我不得不升级到最新的GO运行时。 - user63898
5个回答

6
除了Jsperk的回答,您还可以配置launch.json,使其始终启动调试main.go(拥有main()函数的文件)。由于调用堆栈始于main(),因此您将始终在另一个文件中达到断点。
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "main.go"
            
        }
    ]
}

4

因为软件包命名的问题,我遇到了相同的问题。解决方案是使用Go主文件的标准声明:

package main

func main () {
  // Your code + Breakpoint
}

然后我使用以下的launch.json 文件来进行调试:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Go",
      "type": "go",
      "request": "launch",
      "mode": "debug",
      "program": "${workspaceRoot}/main.go"
    }
  ]
}


1
最近遇到了相同的问题,main.go文件中的testapp包无法工作。将包名更改为main后,问题得以解决! - user743414

3

在我的情况中,正如Jsperk所说,我必须打开包含main()函数的文件,然后才能点击运行。

... main.go需要保持打开状态,如果你有其他文件打开,测试将显示此错误消息。- Jsperk


2
您之所以出现这个错误,是因为您的包名与主函数名不同。
package fibonacci //this needs to be called main. 

 func fibonacci(c, quit chan int) {

    x, y := 0, 1
    for {
        select {
        case c <- x:
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

问题没有提供包名,但作者提到错误发生在 VScode 更新后(之前可以工作)。这表明该包可能是“main”。 - mpx
根据这个特定的错误,包名表明它不是“main”。 - void
@mpx 在Go语言中进行调试非常简单,您必须首先在main.go文件中开始调试。如果您在可执行文件(即main.go)以外的任何其他文件中进行调试,则会收到“无法启动进程:不是可执行文件”的消息。此外,一旦在main.go中开始调试,那么只有在这种情况下才能继续调试其他文件。 - void
是的,你说得对,当尝试调试非主包时也会生成此错误 - 但还有其他更可能的原因。作者提到调试之前可以工作,但在工具链更新后出现了故障。虽然工具链更新不太可能导致故障,但它确实表明他们可能没有将包重命名为不正确的名称。根据Jsperk的评论,作者现在指出这是与他们的launch.json/open文件有关的问题。 - mpx
对我来说有效,谢谢! - Alex Medveshchek

-1
我遇到了和用户"63898"一样的问题,我的电脑是macOS系统。 我尝试了StackOverflow和其他论坛上能找到的所有解决方法。
我甚至确保在执行调试时打开了我的main.go文件,但仍然遇到了这个问题:
API server listening at: 127.0.0.1:29559
could not launch process: not an executable file
Process exiting with code

1
这并没有真正回答问题。如果你有不同的问题,可以通过点击[提问](https://stackoverflow.com/questions/ask)来提问。若想在有新回答时收到通知,可以[关注此问题](https://meta.stackexchange.com/q/345661)。一旦获得足够的[声望](https://stackoverflow.com/help/whats-reputation),您也可以 添加赏金 来吸引更多关注。- 来自审核 - eglease

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