在64位系统上构建和调试32位程序的Golang实践指南

在64位系统上构建和调试32位程序的Golang实践指南 大家好,

我目前正在开发一个旨在同时兼容32位和64位系统的程序。在使用386模式编译的过程中,我遇到了一些需要解决的错误。因此,我决定在我的64位系统上使用Goland来调试这个程序。

我已经按照附图中的说明设置了运行/调试配置。

image

然而,当我尝试调试程序时,遇到了一个阻止我继续进行的错误。

API server listening at: 127.0.0.1:60327
unsupported architecture of windows/i386 - only windows/amd64  windows/arm64 are supported

作为一名开发者,我始终渴望学习和提升技能,因此对于解决此问题的任何帮助或指导,我都将不胜感激。

提前感谢您的帮助!


更多关于在64位系统上构建和调试32位程序的Golang实践指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感谢您花时间帮助我。 我认为到处记录日志虽然不是理想的方法,但总是有用的。 我明天会尝试一下。

更多关于在64位系统上构建和调试32位程序的Golang实践指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


遗憾的是,你无法使用事实上的标准 Go 调试器 Delve 来调试 32 位 Go 程序。你可以尝试改用 gdb,但根据 Go 官方文档,我的理解是这可能很有挑战性,甚至可能出错:

GDB 不能很好地理解 Go 程序。其堆栈管理、线程和运行时包含一些方面,与 GDB 期望的执行模型差异很大,这可能会使调试器感到困惑,即使在程序使用 gccgo 编译时,也可能导致错误的结果。因此,尽管 GDB 在某些情况下可能有用(例如,调试 Cgo 代码或调试运行时本身),但它并不是 Go 程序(尤其是高度并发的程序)的可靠调试器。此外,解决这些困难的问题并非 Go 项目的优先事项。

我仍然在使用 32 位系统,我“调试”它们的方法是在各处添加日志记录,这远非理想。也许其他人会有更好的信息。

在64位系统上调试32位Go程序时,需要确保调试工具链与目标架构匹配。你遇到的错误表明调试器不支持windows/i386架构。以下是解决方案:

  1. 安装32位Delve调试器: Delve是Go的主要调试器,但默认安装的是64位版本。你需要手动安装32位版本:

    # 设置32位环境变量
    set GOARCH=386
    # 安装32位Delve
    go install github.com/go-delve/delve/cmd/dlv[@latest](/user/latest)
    

    安装后,32位dlv可执行文件将位于%GOPATH%\bin\windows_386\目录中。

  2. 配置Goland使用32位Delve: 在Goland的“运行/调试配置”中,将“调试器”路径指向32位dlv.exe

    调试器路径: C:\GoPath\bin\windows_386\dlv.exe
    
  3. 编译32位程序: 确保程序使用GOARCH=386编译:

    set GOARCH=386
    go build -o program_386.exe
    
  4. 示例调试配置: 在Goland中创建自定义Go构建配置:

    // 程序示例:main.go
    package main
    
    import "fmt"
    
    func main() {
        var counter int32 = 0
        for i := 0; i < 10; i++ {
            counter += int32(i)
            fmt.Printf("32位计数器值: %d\n", counter)
        }
    }
    

    配置参数:

    工作目录: 项目根目录
    Go工具参数: -gcflags="all=-N -l"
    环境变量: GOARCH=386
    
  5. 验证架构: 添加架构检查代码:

    package main
    
    import (
        "fmt"
        "runtime"
    )
    
    func main() {
        fmt.Printf("运行架构: %s\n", runtime.GOARCH)
        // ... 其他代码
    }
    

    输出应为386

如果问题仍然存在,检查Goland的Go SDK设置,确保使用的是32位兼容的SDK版本。同时确认系统已安装32位C运行时库(对于cgo程序)。

回到顶部