猿问

Golang fmt.Println() 导致游戏崩溃

我在 Go 中有这个简单的 OpenGL 程序。


当我编译并运行它时,主游戏循环在因分段违规而崩溃之前经历了大约 9 次迭代。


rendering for the  0  time

rendering for the  1  time

rendering for the  2  time

rendering for the  3  time

rendering for the  4  time

rendering for the  5  time

rendering for the  6  time

SIGSEGV: segmentation violation

PC=0x7fdab95a0e29

signal arrived during cgo execution


runtime.cgocall(0x414f90, 0x7fdab9887e88)

    /usr/lib/go/src/pkg/runtime/cgocall.c:149 +0x11b fp=0x7fdab9887e70

github.com/go-gl/gl._Cfunc_glClear(0xc200004100)

    github.com/go-gl/gl/_obj/_cgo_defun.c:340 +0x31 fp=0x7fdab9887e88

github.com/go-gl/gl.Clear(0x4100)

    /mnt/data/Dropbox/Coding/Go/src/github.com/go-gl/gl/gl.go:161 +0x25 fp=0x7fdab9887e98

main.draw()

    /home/josh/Coding/Go/src/github.com/JoshWillik/Wander/wander.go:120 +0x25 fp=0x7fdab9887eb8

main.main()

    /home/josh/Coding/Go/src/github.com/JoshWillik/Wander/wander.go:52 +0x300 fp=0x7fdab9887f48

runtime.main()

    /usr/lib/go/src/pkg/runtime/proc.c:220 +0x11f fp=0x7fdab9887fa0

runtime.goexit()

    /usr/lib/go/src/pkg/runtime/proc.c:1394 fp=0x7fdab9887fa8


goroutine 3 [syscall]:

runtime.goexit()

    /usr/lib/go/src/pkg/runtime/proc.c:1394


rax     0x0

rbx     0x7fdab9887e88

rcx     0x7fdab9887e88

rdx     0x7fdab9887e20

rdi     0x4100

rsi     0xc210001900

rbp     0xc21002a000

rsp     0x7fdab2a4ddd8

r8      0xc210001120

r9      0x7fdab9887e20

r10     0x0

r11     0x286

r12     0x0

r13     0x7fdab9a74000

r14     0x0

r15     0x7fdab2a4e700

rip     0x7fdab95a0e29

rflags  0x10202

cs      0x33

fs      0x0

gs      0x0

如果我删除shouldRender函数中基于时间的逻辑,它会在崩溃前迭代大约 28-29 次。


如果我删除函数gl.Clear()中的draw调用,它会在崩溃之前持续到 90 年代。


如果我删除对fmt.Println()in的调用shouldRender,游戏将按预期运行而不会崩溃。(我已经测试了大约 2 到 3 分钟,所以将近 10,000 帧)


这让我怀疑fmt.Println()对分段违规的调用以某种方式负责。我是否误读了这些标志?如果不是,那么核心功能怎么会Println()如此不稳定?


慕运维8079593
浏览 494回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答