【问题标题】:Go programs hanging on Windows 10挂在 Windows 10 上的 Go 程序
【发布时间】:2015-12-02 02:20:47
【问题描述】:

我遇到了所有挂在 Windows 上的 Go 程序的问题,甚至是一个简单的 Hello world 程序。我已经多次重新安装了 Golang,没有任何改变。我也不能使用 Ctrl+X 或 Ctrl+D 来关闭程序。它仍然会产生将显示在进程监视器上的进程。但我不能从那里或从命令行杀死它。

在 reddit https://www.reddit.com/r/golang/comments/2lvnqk/not_even_hello_world_works/ 上发布了与此类似的问题。但这仍然没有解决方案。

这是我现在要运行的程序:

package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

使用go run -x 运行它会得到以下输出:

WORK=C:\Users\User\AppData\Local\Temp\go-build882050150
mkdir -p $WORK\command-line-arguments\_obj\
mkdir -p $WORK\command-line-arguments\_obj\exe\
cd E:\go\src\github.com\test\hello
"C:\\Go\\pkg\\tool\\windows_amd64\\compile.exe" -o "C:\\Users\\User\\AppData\\Local\\Temp\\go-build882050150\\command-line-arguments.a" -trimpath "C:\\Users\\User\\AppData\\Local\\Temp\\go-build882050150" -p main -complete -buildid 0180ed6e175ea3e4bc497fc21fe0319a733a9c8e -D _/E_/go/src/github.com/test/hello -I "C:\\Users\\User\\AppData\\Local\\Temp\\go-build882050150" -pack "E:\\go\\src\\github.com\\test\\hello\\main.go"
cd .
"C:\\Go\\pkg\\tool\\windows_amd64\\link.exe" -o "C:\\Users\\User\\AppData\\Local\\Temp\\go-build882050150\\command-line-arguments\\_obj\\exe\\main.exe" -L "C:\\Users\\User\\AppData\\Local\\Temp\\go-build882050150" -w -extld=gcc -buildmode=exe -buildid=0180ed6e175ea3e4bc497fc21fe0319a733a9c8e "C:\\Users\\User\\AppData\\Local\\Temp\\go-build882050150\\command-line-arguments.a"
$WORK\command-line-arguments\_obj\exe\main.exe

之后它就坐在那里,什么也不吃。不管我运行什么程序,它都会永远挂起。

不知道从这里去哪里。我并没有真正在 Windows 上开发,但我试图在 Ubuntu 上使用交叉编译,并且在使用交叉编译的二进制文件时遇到了这个问题,我想我会尝试直接在 Windows 上编译。但似乎我的 Windows 不喜欢 Golang 编译的二进制文件。

Go 版本是 1.5.1 windows/amd64。

这是go env的输出:

set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=E:\go
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GO15VENDOREXPERIMENT=
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1

【问题讨论】:

  • 您是否正在运行任何类型的防病毒软件?
  • @JimB,是的。 Avast 阻止所有 go 文件运行,因为它们与更常见的 C 编译二进制文件相比有多么不同。最终排除了我安装 Go 和我的 GOPATH 的目录。还必须为 Go 在运行程序时使用的临时目录添加一个排除项。对我来说是C:\Users\user\AppData\Local\Temp\go-build*\*。为 File System Shield 和 General 下的排除部分添加了排除项。
  • @JDWardle 如果您自己找到了解决方案,您应该post an answer 让有同样问题的人更容易看到它。

标签: go windows-10


【解决方案1】:

Avast 是愚蠢的。禁用 Avast 并且所有程序都可以正常工作....

当然,禁用 Avast 并不理想,所以我必须想办法排除 go 文件。不幸的是,除非您为二进制文件设置单独的排除项,否则无法自行排除已编译的文件。但是排除 go 特定目录将起作用。

我最终排除了 go 的安装位置,这是 C:\Go 和 GOPATH 的目录 E:\go

只要从这两个目录中的任何一个运行二进制文件,这在大多数情况下都有效,但我在使用 go run 命令时仍然遇到问题。使用go run -x 命令,我能够找出 Go 将临时编译的二进制文件放在哪里。这最终位于C:\Users\username\AppData\Local\Temp\go-build1234\。但是,每次我使用 go run 时,go 都会创建一个新目录,因此我必须在 Avast 上创建一个排除项,并设置两个通配符 C:\Users\username\AppData\Local\Temp\go-build*\*。现在程序可以正常运行了。

这些是我最终得到的排除:

【讨论】:

  • 谢谢,工作。但是对于排除项,您必须运行“go run -x filename.go”并检查使用的确切路径。例如,对我来说,路径是“C:\Users\WILDEX~1\AppData\...”而不是“C:\Users\Wildex999\AppData\...”。而且我必须准确输入它才能工作,即使它们都是相同的路径。
  • 谢谢。每次我的电脑运行 Go Code 时,我都会变得非常烦躁。仅供参考,在您的 Avast 中添加排除项的最新位置是例外。您可以转到 Menu > General > Exceptions,然后添加您的 Go 目录路径。
【解决方案2】:

问题是,如果没有设置 GOTMPDIR,golang 有时会在通用的 \Temp 目录中构建,作为卡巴斯基的通用例外是危​​险的。对我来说,卡巴斯基不允许在 Avast 等目录异常中使用通配符

假设您已经在防病毒软件中将 GOPATH 作为例外添加(例如,“C:\Users\go”...对我有用的是

  1. 在该路径中添加一个新目录(我将我的命名为“tmp”,但您可能会为其命名很多东西),即“C:\Users\go\tmp”
  2. 给它设置golang环境变量GOTMPDIR...

去 env -w GOTMPDIR="C:\Users\go\tmp"

问题就消失了。但请注意,我已经将“C:\Users\go”添加为我的防病毒软件的例外。

【讨论】:

  • 很好,绝对是一个更好的解决方案,而不是完全向临时目录添加异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2016-09-05
相关资源
最近更新 更多