Go语言程序运行出现exit status 2错误的原因排查求助
Go程序exit status 2错误排查
代码示例
package main import ( "C" // 注意这里的多余导入 "fmt" "io" "net/http" "time" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/widget" ) func Call2(someurl string) (*http.Response, error) { req, err := http.NewRequest(http.MethodGet, someurl, nil) if err != nil { fmt.Printf("Error creating request: %s", err) return nil, err } client := http.Client{ Timeout: 30 * time.Second, } res, err := client.Do(req) if err != nil { fmt.Printf("Error making HTTP request: %s", err) return nil, err } return res, nil } func tidyUp() { fmt.Println("Exited") } func main() { myApp := app.New() myWindow := myApp.NewWindow("Hello") k, err := Call2("https://acre.iex.cloud/v1/data/CORE/REF_DATA?token=pk_79891f5cbcce4099ae063588956f937a") if err != nil { fmt.Printf("Error making HTTP request: %s", err) return } defer k.Body.Close() b, err := io.ReadAll(k.Body) if err != nil { fmt.Printf("Error reading response body: %s", err) return } // fmt.Println(string(b)) myWindow.SetContent(widget.NewLabel(string(b))) myWindow.Show() myApp.Run() tidyUp() }
错误日志片段
开头部分
Exception 0xc0000005 0x0 0x7ffbd991a0f0 0x7ff89943445e PC=0x7ff89943445e signal arrived during external code execution runtime.cgocall(0x7ff6ead942c0, 0xc000065da0) C:/Program Files/Go/src/runtime/cgocall.go:157 +0x3e fp=0xc000065d78 sp=0xc000065d40 pc=0x7ff6ea9655be github.com/go-gl/glfw/v3.3/glfw._Cfunc_glfwMakeContextCurrent(0x2157624b2d0)
结尾部分
C:/Program Files/Go/src/runtime/asm_amd64.s:1650 +0x1 fp=0xc01494dfe8 sp=0xc01494dfe0 pc=0x7ff6ea9c8ac1 created by os/signal.Notify.func1.1 in goroutine 55 C:/Program Files/Go/src/os/signal/signal.go:151 +0x1f rax 0xfff0fff rbx 0xd075dff3a0 rcx 0x7ffbd991a0cc rdi 0x7ff899c26100 rsi 0x2157c392b20 rbp 0xd075dfefb0 rsp 0xd075dfeea8 r8 0xd075dfefc0 r9 0xd075dff3a0 r10 0xd075dff190 r11 0x0 r12 0x100 r13 0x0 r14 0x1 r15 0x0 rip 0x7ff89943445e rflags 0x10206 cs 0x33 fs 0x53 gs 0x2b exit status 2
错误原因及解决方法
1. 多余的CGO导入是核心问题
代码里导入了"C"但完全没有使用,这会强制Go启用CGO模式,而Fyne依赖的GLFW库在CGO模式下容易触发Windows平台的内存访问违例(Exception 0xc0000005就是典型的内存访问错误)。直接删掉import "C",重新运行程序即可解决大部分此类问题。
2. 优化GUI线程操作逻辑
Fyne的UI操作必须在主线程执行,当前代码先执行API请求再初始化UI,若请求耗时较长可能导致UI初始化时机异常。可以把API请求放到goroutine中,获取数据后再通过Fyne的主线程更新UI:
func main() { myApp := app.New() myWindow := myApp.NewWindow("Hello") label := widget.NewLabel("加载中...") myWindow.SetContent(label) myWindow.Show() go func() { k, err := Call2("https://acre.iex.cloud/v1/data/CORE/REF_DATA?token=pk_79891f5cbcce4099ae063588956f937a") if err != nil { fmt.Printf("Error making HTTP request: %s", err) return } defer k.Body.Close() b, err := io.ReadAll(k.Body) if err != nil { fmt.Printf("Error reading response body: %s", err) return } // 在主线程更新UI myApp.RunOnMain(func() { label.SetText(string(b)) }) }() myApp.Run() tidyUp() }
3. 更新Fyne依赖并重新构建
若问题依然存在,可能是Fyne或其依赖的GLFW库版本兼容性问题,执行以下命令更新到最新版本:
go get fyne.io/fyne/v2@latest go mod tidy
之后重新编译运行程序。
4. 使用Fyne官方打包工具构建
Windows下直接用go run可能跳过部分依赖库的处理,尝试用Fyne的打包工具生成可执行文件:
fyne package -os windows # 图标可选,可添加-icon参数指定图标文件
运行生成的exe文件即可。
内容的提问来源于stack exchange,提问作者Ethan Leonard
相关产品推荐
相关产品推荐

