Golang运行简单"Hello World"程序时出现随机崩溃问题
Golang运行简单"Hello World"程序时出现随机崩溃问题 大家好,
这个问题从 Go 1.15.3 版本开始就出现了(这也是我开始使用 Go 的时候),我今天刚更新到 1.15.6 版本,但仍然遇到了同样的错误。
首先,这是代码:
package main
import "fmt"
func main() {
fmt.Println("This worked!")
}
看起来很简单,对吧?可能会出什么问题呢?对我来说,19/20 的情况下它不会出错。但有 1/20 的概率会出错——我会得到类似下面的调用栈:
test.exe
Exception 0xc0000005 0x0 0x7ffa8e4f0fff 0x1ecead80000
PC=0x1ecead80000
runtime: unknown pc 0x1ecead80000
stack: frame={sp:0xc8fe1fe060, fp:0x0} stack=[0x0,0xc8fe1ff740)
000000c8fe1fdf60: 000000c8fe1fdfa8 000000c8fe1fdfd0
000000c8fe1fdf70: 000000c8fe1fdf98 000000c8fe1fdf90
000000c8fe1fdf80: 000000c8fe1fdf94 000001ece4280000
000000c8fe1fdf90: 0000000000000000 0000000000000000
000000c8fe1fdfa0: 0000000000000000 0000000000000005
000000c8fe1fdfb0: 000000c8fe1fe0f8 00007ffa8be3a2c5
000000c8fe1fdfc0: 000001ece40129a0 00007ffa8e3146ce
000000c8fe1fdfd0: 00007ffa8e2f00e8 000001ece404f3f0
000000c8fe1fdfe0: 00007ffa8be3a2bf 000000c8fe1fe030
000000c8fe1fdff0: 004f0044004e0049 0053005c00530057
000000c8fe1fe000: 000001ece40129a0 0000000000000000
000000c8fe1fe010: 000001ece403ed90 006l006400050005
000000c8fe1fe020: 00007ffa8be3a2bf 0000000000000000
000000c8fe1fe030: 00007ffa00000000 00007ffa8e2f00e8
000000c8fe1fe040: 0000000000000000 0000000000000000
000000c8fe1fe050: 0000000000000001 00007ffa8e313783
000000c8fe1fe060: <000001ec00000001 0000000000000000
000000c8fe1fe070: 0000000000000000 000000c8fe1fe168
000000c8fe1fe080: 0000000000000000 0000000000000000
000000c8fe1fe090: 0000000000000000 0000000000000000
000000c8fe1fe0a0: 000001ece404f3f0 00007ffa8e4412a0
000000c8fe1fe0b0: 000001ece40129a0 00007ffa8e4438c0
000000c8fe1fe0c0: 000000000000097d 00007ffa8aeaccd8
000000c8fe1fe0d0: 00007ffa8aeaa148 00007ffa8e4412c8
000000c8fe1fe0e0: 00007ffa8e4540ef 00007ffa8aea0000
000000c8fe1fe0f0: 00007ffa8e445eb4 00007ffa8e370c40
000000c8fe1fe100: 0000000000000000 0000000000000000
000000c8fe1fe110: 0000000000000000 0000000000000000
000000c8fe1fe120: 000001ece4050360 0000000000000040
000000c8fe1fe130: 0000000000000003 00007ffa8e45b3f0
000000c8fe1fe140: 0000000000000001 000000c8fe1fe400
000000c8fe1fe150: 000001ece403ed90 00007ffa8e351568
runtime: unknown pc 0x1ecead80000
stack: frame={sp:0xc8fe1fe060, fp:0x0} stack=[0x0,0xc8fe1ff740)
000000c8fe1fdf60: 000000c8fe1fdfa8 000000c8fe1fdfd0
000000c8fe1fdf70: 000000c8fe1fdf98 000000c8fe1fdf90
000000c8fe1fdf80: 000000c8fe1fdf94 000001ece4280000
000000c8fe1fdf90: 0000000000000000 0000000000000000
000000c8fe1fdfa0: 0000000000000000 0000000000000005
000000c8fe1fdfb0: 000000c8fe1fe0f8 00007ffa8be3a2c5
000000c8fe1fdfc0: 000001ece40129a0 00007ffa8e3146ce
000000c8fe1fdfd0: 00007ffa8e2f00e8 000001ece404f3f0
000000c8fe1fdfe0: 00007ffa8be3a2bf 000000c8fe1fe030
000000c8fe1fdff0: 004f0044004e0049 0053005c00530057
000000c8fe1fe000: 000001ece40129a0 0000000000000000
000000c8fe1fe010: 000001ece403ed90 006l006400050005
000000c8fe1fe020: 00007ffa8be3a2bf 0000000000000000
000000c8fe1fe030: 00007ffa00000000 00007ffa8e2f00e8
000000c8fe1fe040: 0000000000000000 0000000000000000
000000c8fe1fe050: 0000000000000001 00007ffa8e313783
000000c8fe1fe060: <000001ec00000001 0000000000000000
000000c8fe1fe070: 0000000000000000 000000c8fe1fe168
000000c8fe1fe080: 0000000000000000 0000000000000000
000000c8fe1fe090: 0000000000000000 0000000000000000
000000c8fe1fe0a0: 000001ece404f3f0 00007ffa8e4412a0
000000c8fe1fe0b0: 000001ece40129a0 00007ffa8e4438c0
000000c8fe1fe0c0: 000000000000097d 00007ffa8aeaccd8
000000c8fe1fe0d0: 00007ffa8aeaa148 00007ffa8e4412c8
000000c8fe1fe0e0: 00007ffa8e4540ef 00007ffa8aea0000
000000c8fe1fe0f0: 00007ffa8e445eb4 00007ffa8e370c40
000000c8fe1fe100: 0000000000000000 0000000000000000
000000c8fe1fe110: 0000000000000000 0000000000000000
000000c8fe1fe120: 000001ece4050360 0000000000000040
000000c8fe1fe130: 0000000000000003 00007ffa8e45b3f0
000000c8fe1fe140: 0000000000000001 000000c8fe1fe400
000000c8fe1fe150: 000001ece403ed90 00007ffa8e351568
rax 0x7ffa8aead87c
rbx 0x7ffa8aead87a
rcx 0x41
rdi 0xffffffffffbadd11
rsi 0x0
rbp 0x7ffa8b04a100
rsp 0xc8fe1fe060
r8 0x0
r9 0x0
r10 0x0
r11 0x97c
r12 0xc000007a
r13 0x0
r14 0x7ffa8aead87c
r15 0x7ffa8e2f0000
rip 0x1ecead80000
rflags 0x10202
cs 0x33
fs 0x53
gs 0x2b
……起初我以为是构建出的可执行文件有问题,但我发现使用 Go 本身也能复现这个行为:
go run test.go
Exception 0xc0000005 0x0 0x7ffa8e4f0fff 0x153a8980000
PC=0x153a8980000
runtime: unknown pc 0x153a8980000
stack: frame={sp:0x31ec1fe3a0, fp:0x0} stack=[0x0,0x31ec1ffa80)
00000031ec1fe2a0: 00000031ec1fe2e8 00000031ec1fe310
00000031ec1fe2b0: 00000031ec1fe2d8 00000031ec1fe2d0
00000031ec1fe2c0: 00000031ec1fe2d4 0000015383670000
00000031ec1fe2d0: 0000000000000000 0000000000000000
00000031ec1fe2e0: 0000000000000000 0000000000000005
00000031ec1fe2f0: 00000031ec1fe438 00007ffa8be3a2c5
00000031ec1fe300: 0000015383422ab0 00007ffa8e3146ce
00000031ec1fe310: 00007ffa8e2f00e8 0000015383456290
00000031ec1fe320: 00007ffa8be3a2bf 00000031ec1fe370
00000031ec1fe330: 004f0044004e0049 0053005c00530057
00000031ec1fe340: 0000015383422ab0 0000000000000000
00000031ec1fe350: 000001538343d8f0 006l006400050005
00000031ec1fe360: 00007ffa8be3a2bf 0000000000000000
00000031ec1fe370: 00007ffa00000000 00007ffa8e2f00e8
00000031ec1fe380: 0000000000000000 0000000000000000
00000031ec1fe390: 0000000000000001 00007ffa8e313783
00000031ec1fe3a0: <0000015300000001 0000000000000000
00000031ec1fe3b0: 0000000000000000 00000031ec1fe4a8
00000031ec1fe3c0: 0000000000000000 0000000000000000
00000031ec1fe3d0: 0000000000000000 0000000000000000
00000031ec1fe3e0: 0000015383456290 00007ffa8e4412a0
00000031ec1fe3f0: 0000015383422ab0 00007ffa8e4438c0
00000031ec1fe400: 000000000000097d 00007ffa8aeaccd8
00000031ec1fe410: 00007ffa8aeaa148 00007ffa8e4412c8
00000031ec1fe420: 00007ffa8e4540ef 00007ffa8aea0000
00000031ec1fe430: 00007ffa8e445eb4 00007ffa8e370c40
00000031ec1fe440: 0000000000000000 0000000000000000
00000031ec1fe450: 0000000000000000 0000000000000000
00000031ec1fe460: 00000153834515c0 0000000000000040
00000031ec1fe470: 0000000000000003 00007ffa8e45b3f0
00000031ec1fe480: 0000000000000001 00000031ec1fe700
00000031ec1fe490: 000001538343d8f0 00007ffa8e351568
runtime: unknown pc 0x153a8980000
stack: frame={sp:0x31ec1fe3a0, fp:0x0} stack=[0x0,0x31ec1ffa80)
00000031ec1fe2a0: 00000031ec1fe2e8 00000031ec1fe310
00000031ec1fe2b0: 00000031ec1fe2d8 00000031ec1fe2d0
00000031ec1fe2c0: 00000031ec1fe2d4 0000015383670000
00000031ec1fe2d0: 0000000000000000 0000000000000000
00000031ec1fe2e0: 0000000000000000 0000000000000005
00000031ec1fe2f0: 00000031ec1fe438 00007ffa8be3a2c5
00000031ec1fe300: 0000015383422ab0 00007ffa8e3146ce
00000031ec1fe310: 00007ffa8e2f00e8 0000015383456290
00000031ec1fe320: 00007ffa8be3a2bf 00000031ec1fe370
00000031ec1fe330: 004f0044004e0049 0053005c00530057
00000031ec1fe340: 0000015383422ab0 0000000000000000
00000031ec1fe350: 000001538343d8f0 006l006400050005
00000031ec1fe360: 00007ffa8be3a2bf 0000000000000000
00000031ec1fe370: 00007ffa00000000 00007ffa8e2f00e8
00000031ec1fe380: 0000000000000000 0000000000000000
00000031ec1fe390: 0000000000000001 00007ffa8e313783
00000031ec1fe3a0: <0000015300000001 0000000000000000
00000031ec1fe3b0: 0000000000000000 00000031ec1fe4a8
00000031ec1fe3c0: 0000000000000000 0000000000000000
00000031ec1fe3d0: 0000000000000000 0000000000000000
00000031ec1fe3e0: 0000015383456290 00007ffa8e4412a0
00000031ec1fe3f0: 0000015383422ab0 00007ffa8e4438c0
00000031ec1fe400: 000000000000097d 00007ffa8aeaccd8
00000031ec1fe410: 00007ffa8aeaa148 00007ffa8e4412c8
00000031ec1fe420: 00007ffa8e4540ef 00007ffa8aea0000
00000031ec1fe430: 00007ffa8e445eb4 00007ffa8e370c40
00000031ec1fe440: 0000000000000000 0000000000000000
00000031ec1fe450: 0000000000000000 0000000000000000
00000031ec1fe460: 00000153834515c0 0000000000000040
00000031ec1fe470: 0000000000000003 00007ffa8e45b3f0
00000031ec1fe480: 0000000000000001 00000031ec1fe700
00000031ec1fe490: 000001538更多关于Golang运行简单"Hello World"程序时出现随机崩溃问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
也许这能帮到你:
“Exception 0xc0000005”, “runtime: unknown pc” on program exit with loaded windows dll
你使用的 Go 版本是什么(go version)?
$ go version
go version go1.15.5 windows/amd64
这个问题在最新版本中是否复现? 是的
什么…
标签: OS-Windows
更多关于Golang运行简单"Hello World"程序时出现随机崩溃问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个典型的访问违规错误(Exception 0xc0000005),通常由内存损坏或外部干扰引起。从堆栈跟踪看,程序计数器指向无效地址(0x1ecead80000),这通常不是Go运行时本身的问题。
以下是几个可能的原因和排查步骤:
1. 检查系统内存问题
随机崩溃可能是内存硬件故障导致的。运行Windows内存诊断工具:
mdsched.exe
2. 检查防病毒软件干扰
某些防病毒软件会注入代码到进程中,可能导致冲突。尝试:
- 暂时禁用防病毒软件
- 将Go安装目录和项目目录添加到防病毒软件白名单
3. 检查Go环境完整性
重新安装Go并清理缓存:
go clean -cache
go clean -modcache
4. 使用不同构建参数测试
尝试禁用优化和内联:
// 构建时添加参数
go build -gcflags="-N -l" test.go
5. 检查系统DLL冲突
从堆栈中看到多个系统DLL(ntdll.dll、kernel32.dll等),可能存在DLL冲突。运行系统文件检查:
sfc /scannow
6. 最小化测试环境
创建一个全新的测试目录,使用最简单的代码:
// test_minimal.go
package main
func main() {
println("Hello")
}
编译并运行:
cd %TEMP%
mkdir gotest
cd gotest
go mod init test
go build test_minimal.go
test_minimal.exe
7. 检查Go版本兼容性
虽然你说从1.15.3就有问题,但可以尝试:
- 降级到1.14.x版本
- 升级到1.16.x版本(如果已发布)
8. 使用调试器获取更多信息
如果问题持续,使用WinDbg附加到进程:
// 编译时保留调试信息
go build -ldflags="-w" test.go
// 使用WinDbg运行
9. 检查环境变量
某些环境变量可能影响Go运行时:
// 查看相关环境变量
echo %GODEBUG%
echo %GOGC%
echo %GOTRACEBACK%
10. 系统级排查
从堆栈中看到异常发生在系统DLL中,这可能是:
- 系统更新不完整
- 驱动程序冲突
- 其他系统级软件干扰
建议按顺序尝试以上步骤,特别是内存测试和防病毒软件排查,因为这类随机崩溃通常与Go语言本身无关。

