Golang在1.21.6版本引导过程中测试失败问题探讨

Golang在1.21.6版本引导过程中测试失败问题探讨 我需要帮助引导 1.21.6 版本。有几个测试失败了,我看到有关于 gdb、swig 等的要求,但这些要求很难猜测。

3 个致命错误:trace: ReadTrace got invalid frequency in os/signal -src/runtime/panic.go syscall - exec_linux_test.go:354: Cmd failed with err fork/exec /tmp/go-build1662809362/b1680/syscall.test: no such file or directory,该错误在 TestUnshareUidGidMapping 中也重复出现 runtime/trace -runtime/panic.go

我推测这些错误是由两个测试产生的,即 TestUnshareUidGidMapping 和 TestAnalyzeAnnotations,但它们并行写入跟踪信息,导致情况混乱。

在 vcstest_test.go 中有 7 个 git 测试失败 TestScripts/git/no-tags.txt TestScripts/git/modlegacy1-old.txt TestScripts/git/modlegacy1-new.txt TestScripts/git/mainonly.txt TestScripts/git/insecurerepo.txt TestScripts/git/hello.txt TestScripts/git/commit-after-tag.txt

可能是 git 版本过时了?

还有一个:

go tool dist test -run=^archive/tar$
Failed: exit status 1

请告诉我应该安装什么或者如何修复它们。


更多关于Golang在1.21.6版本引导过程中测试失败问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

访问此页面以阅读更多信息

更多关于Golang在1.21.6版本引导过程中测试失败问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


  • 你所使用的软件/项目的官方文档。 它们通常包含故障排除部分或已知问题列表。

可以考虑编写一个简短的 INSTALL 文件,其中列出源码所需的依赖。任何人下载、解压后,都可以根据特定版本的要求进行操作。

我无法读取关于引导程序的更详细信息。系统应用程序已过时,因此无法更新。重建gdb和swig很容易。然而,重建git相当困难,因为gnutls依赖许多应用程序。让Go像Python一样只依赖openssl是否可行?关于权限等信息无处可查。

1. 解决缺失的依赖项:

  • 安装 gdb 和 swig: 这些是 Go 构建过程中某些部分所必需的。使用您系统的包管理器来安装它们:
    • Ubuntu/Debian: sudo apt install gdb swig
    • Fedora/CentOS: sudo dnf install gdb swig
    • macOS: brew install gdb swig

2. 解决“Cmd failed with err fork/exec…”错误:

  • 检查文件权限: 确保临时构建文件以正确的权限创建:
    • 暂时禁用任何可能干扰文件创建的安全软件。
    • 验证运行构建的用户对 /tmp 目录具有写入权限。

3. 修复“trace: ReadTrace got invalid frequency”错误:

  • 检查跟踪配置: 检查是否有任何与跟踪相关的工具或设置与 Go 构建过程冲突。
  • 升级 Go 版本: 如果可能,考虑升级到较新的版本(1.21.7 或更高版本),因为新版本可能包含与跟踪功能相关的错误修复。

4. 解决失败的 Git 测试:

  • 升级 Git: 确保安装了最新版本的 Git。
  • 验证环境变量: 检查是否有任何 Git 相关的环境变量设置不正确。
  • 检查测试脚本: 如果可能,检查失败的 Git 测试脚本以定位具体问题。

5. 排查“archive/tar”测试失败:

  • 检查日志: 在构建日志中查找与 archive/tar 测试相关的任何错误消息或线索。
  • 检查测试代码: 如果可能,检查测试代码以发现潜在问题或依赖项。
  • 考虑交叉编译: 如果为不同的架构进行构建,请确保您拥有必要的交叉编译工具和依赖项。

针对你遇到的Go 1.21.6引导测试失败问题,以下是具体分析和解决方案:

1. 系统调用测试失败(TestUnshareUidGidMapping)

这个错误通常是由于测试环境缺少必要的Linux内核功能或权限导致的。需要确保:

  • 内核支持user namespace(CONFIG_USER_NS=y)
  • 有足够的权限运行unshare操作

检查内核配置:

cat /boot/config-$(uname -r) | grep CONFIG_USER_NS

如果在内核中启用了user namespace,尝试以root权限运行测试:

sudo go test -c syscall
sudo ./syscall.test -test.run="TestUnshareUidGidMapping"

2. 跟踪测试失败(trace测试)

trace测试失败通常与CPU频率读取有关。可以尝试禁用相关测试或设置环境变量:

# 跳过trace测试
go tool dist test -run='^[^t].*'  # 跳过t开头的测试
# 或单独运行其他测试
go tool dist test -run='^runtime$' -v

设置跟踪缓冲区大小:

export GOEXPERIMENT=rangefunc
export GODEBUG=tracebackancestors=100

3. Git测试失败

这些测试失败确实可能是由于git版本过时导致的。Go的测试套件对git有特定要求:

安装或更新git到最新版本:

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install git -y

# CentOS/RHEL
sudo yum install git -y

# 验证git版本
git --version

确保git配置正确:

git config --global user.email "test@example.com"
git config --global user.name "Test User"

4. archive/tar测试失败

这个测试失败可能有多种原因。尝试单独运行并查看详细输出:

cd src/archive/tar
go test -v -run=. 2>&1 | head -50

如果测试涉及文件权限问题,可能需要:

# 清除测试缓存
go clean -testcache
# 重新运行测试
go test ./archive/tar -v

5. 完整的引导测试修复方案

创建一个测试脚本,逐步执行引导过程:

#!/bin/bash
# build_test.sh

# 1. 更新系统包
sudo apt-get update
sudo apt-get install -y gcc git swig gdb

# 2. 设置环境变量
export GO111MODULE=on
export GOROOT_BOOTSTRAP=$(go env GOROOT)

# 3. 清理并重新编译
cd /path/to/go/src
./make.bash

# 4. 运行dist测试,跳过有问题的测试
go tool dist test -run='^(runtime|archive/tar)$' -v

# 5. 如果仍有失败,尝试禁用并行测试
go test -parallel=1 syscall -v

6. 针对具体错误的代码示例

对于trace测试问题,可以查看runtime/trace测试文件并添加调试:

// 在测试文件中添加调试信息
func TestTraceFrequency(t *testing.T) {
    if debug {
        t.Log("Checking trace frequency...")
    }
    // 原有的测试逻辑
}

对于git测试,确保测试环境有正确的git配置:

// 在测试前设置git环境
func setupGitTest(t *testing.T) {
    cmd := exec.Command("git", "config", "--global", "user.email", "test@example.com")
    if err := cmd.Run(); err != nil {
        t.Skipf("git not available: %v", err)
    }
}

7. 快速修复方案

如果时间有限,可以跳过有问题的测试继续引导过程:

# 跳过所有失败的测试类别
go tool dist test -no-rebuild -run='^(?!syscall|runtime/trace|cmd/go).*'

# 或者只运行核心测试
go tool dist test -run='^runtime$|^strings$|^bytes$'

这些解决方案应该能帮助你解决大部分引导测试失败的问题。如果特定测试仍然失败,可能需要查看具体的测试输出日志来进一步诊断。

回到顶部