Golang在Windows最新更新后cmd进程挂起问题

Golang在Windows最新更新后cmd进程挂起问题 在最新的Windows更新后,Go CLI命令会卡住,持续占用CPU且永不完成。 我已尝试升级到最新的1.15.4版本、修复安装、卸载后重新安装。但都无效。

运行环境为Windows 10。

附上截图: image

6 回复

您提到使用的是公司电脑,您能否获取关于执行上下文的更详细统计信息?是什么消耗了所有额外的CPU?

您能看到任何由Go拥有的文件句柄吗?

也许是公司强制安装的某些病毒扫描程序或互联网安全套件?

我曾遇到过这些安全套件和防病毒软件与编译器工具链之间的各种问题。

更多关于Golang在Windows最新更新后cmd进程挂起问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


asafdl:

这是一个可能的原因,我在公司里询问了一圈,没有人报告过这个问题,但这种情况仍然可能存在。

在您公司IT部门的协助和监督下,您应该暂时禁用防病毒工具/安全套件,并尝试构建一个已知会导致Go编译器停止的小程序。

如果在没有防病毒/ISS软件的情况下可以正常工作,那么您的IT部门就需要弄清楚如何以及将哪些内容加入白名单,因为这很大程度上取决于具体的防病毒/ISS软件。

你提到是在公司的电脑上,你能获取到关于执行环境的更详细的统计信息吗?是什么消耗了所有额外的CPU?

  • 除了go.exe任务占用CPU外,我看不到任何其他工作在进行——尝试进行了一些Windows调试调查,但没有找到任何其他信息。

你能看到任何由go拥有的文件句柄吗?

  • 我在哪里可以找到这个信息?

也许是你们公司强制安装的某些病毒扫描程序或互联网安全套件?

  • 这是一个可能的原因,我在公司里问了一圈,没有人报告过这个问题,但仍有可能是这个原因。

petrus:

set TEMP TEMP=C:\Users\petrus\AppData\Local\Temp

感谢回复。我的截图隐藏了用户名,是因为那是我的公司ID,我不想在论坛上公开。

构建命令在控制台没有输出更多信息,在设置了 WORK 变量后就卡住了,占用 CPU 但什么都不做。

我尝试将我的 TMP 和 TEMP 变量设置为 Temp 文件夹,但进程仍然卡住。

此外,其他命令如 go rungo clean 也会卡住。

我无法复现你的问题,因为你发的是图片。请发布文本内容。

我预期的输出是这样的:

>go build -x
WORK=C:\Users\petrus\AppData\Local\Temp\go-build237438923
mkdir -p $WORK\b001\

WORK 目录位于通过 GetTempPathW 函数获取的临时目录中:

GetTempPathW 函数 (fileapi.h)

GetTempPathW function (fileapi.h) - Win32 apps | Microsoft Learn

GetTempPath 函数按以下顺序检查环境变量,并使用找到的第一个路径:

  1. TMP 环境变量指定的路径。
  2. TEMP 环境变量指定的路径。
  3. USERPROFILE 环境变量指定的路径。
  4. Windows 目录。

请注意,该函数不验证路径是否存在,也不测试当前进程是否对该路径有任何类型的访问权限。

我的 TMP 和 TEMP 环境变量是:

>set TMP
TMP=C:\Users\petrus\AppData\Local\Temp
>set TEMP
TEMP=C:\Users\petrus\AppData\Local\Temp

正如预期的那样,它们包含了我的用户名 “petrus”。

你的"图片"非常奇怪。你的用户名似乎是 “”。

请以文本形式发布在你的系统上执行以下命令及其输出:

>set TMP

>set TEMP

这是一个已知问题,通常与Windows更新后终端环境配置有关。问题通常出现在go getgo mod等需要网络访问的命令上。

主要原因是Windows更新可能重置了某些环境变量或终端配置,导致Go命令在尝试解析代理设置或DNS时挂起。以下是解决方案:

1. 检查并设置正确的环境变量

// 检查当前环境变量的简单程序
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("GOPROXY:", os.Getenv("GOPROXY"))
    fmt.Println("GOSUMDB:", os.Getenv("GOSUMDB"))
    fmt.Println("HTTP_PROXY:", os.Getenv("HTTP_PROXY"))
    fmt.Println("HTTPS_PROXY:", os.Getenv("HTTPS_PROXY"))
}

运行此程序查看环境变量。如果GOPROXY设置不正确或为空,需要手动设置:

# PowerShell中设置
$env:GOPROXY = "https://proxy.golang.org,direct"
$env:GOSUMDB = "sum.golang.org"

# 或使用国内镜像
$env:GOPROXY = "https://goproxy.cn,direct"
$env:GOSUMDB = "sum.golang.org"

2. 永久设置环境变量

在系统环境变量中添加:

  • 变量名:GOPROXY
  • 变量值:https://proxy.golang.org,direct

同时检查Path变量中Go的安装路径是否正确。

3. 禁用IPv6(如果相关)

Windows更新有时会启用IPv6优先,可能导致DNS解析问题:

# 临时禁用IPv6
netsh interface ipv6 set state "以太网" disabled

# 或在网络适配器设置中禁用IPv6

4. 清除Go模块缓存

go clean -modcache

5. 使用特定命令测试

创建一个简单的测试程序:

// test_network.go
package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := &http.Client{
        Timeout: 10 * time.Second,
    }
    
    resp, err := client.Get("https://proxy.golang.org")
    if err != nil {
        fmt.Printf("Network error: %v\n", err)
        return
    }
    defer resp.Body.Close()
    
    fmt.Println("Network connection successful")
}

运行测试:

go run test_network.go

6. 检查杀毒软件/防火墙

某些Windows更新后,防火墙规则可能被重置。暂时禁用Windows Defender防火墙测试:

# 临时禁用防火墙(测试后请重新启用)
netsh advfirewall set allprofiles state off

7. 使用替代终端

尝试在Windows Terminal、Git Bash或PowerShell Core中运行Go命令,而不是传统的cmd.exe。

如果上述方法都不起作用,请提供以下信息以便进一步诊断:

  • 运行go env的输出
  • 具体是哪个Go命令挂起
  • 是否有特定的错误信息出现在任务管理器中
回到顶部