situation: i changed examples/rtreq.go a little bit:
func worker_task() {
/* ... */
total := 0
for {
runtime.GC()
aka: force the workers to call the garbage-collector quite often. this triggers this crash:
% go version
go version go1.4.2 linux/amd64
% ./rtreq
runtime: garbage collector found invalid heap pointer *(0xc20801d5c8+0xa0)=0x20 s=nil
fatal error: invalid heap pointer
<lots of stack-traces>
this won't happen if i run the sample program like this:
% env GODEBUG=invalidptr=0 ./rtreq
the 'invalidptr' option was introduced to handle GC-related behavior in golang-1.4: "As of Go 1.3, the runtime crashes if it finds a memory word that should contain a valid pointer but instead contains an obviously invalid pointer (for example, the value 3). Programs that store integers in pointer values may run afoul of this check and crash. In Go 1.4, setting the GODEBUG variable invalidptr=0 disables the crash as a workaround, but we cannot guarantee that future releases will be able to avoid the crash; the correct fix is to rewrite code not to alias integers and pointers."
i rechecked: using either golang-1.2 or gccgo-5.x-something (which is identical to golang-1.2) no such crashes occur.
the full crash log:
% ./rtreq
runtime: garbage collector found invalid heap pointer *(0xc20801d5c8+0xa0)=0x20 s=nil
fatal error: invalid heap pointer
runtime stack:
runtime.throw(0x782543)
/usr/local/go/src/runtime/panic.go:491 +0xad fp=0x7fb18f645918 sp=0x7fb18f6458e8
scanblock(0xc20801d5c8, 0xc8, 0x5204e0)
/usr/local/go/src/runtime/mgc0.c:381 +0x551 fp=0x7fb18f645a58 sp=0x7fb18f645918
scanframe(0x7fb18f645b60, 0x0, 0x7fb100000101)
/usr/local/go/src/runtime/mgc0.c:722 +0x164 fp=0x7fb18f645ac8 sp=0x7fb18f645a58
runtime.gentraceback(0x4045e5, 0xc20801d520, 0x0, 0xc208000120, 0x0, 0x0, 0x7fffffff, 0x7fb18f645c10, 0x0, 0x0, ...)
/usr/local/go/src/runtime/traceback.go:311 +0x7a8 fp=0x7fb18f645bb8 sp=0x7fb18f645ac8
scanstack(0xc208000120)
/usr/local/go/src/runtime/mgc0.c:780 +0x21c fp=0x7fb18f645c28 sp=0x7fb18f645bb8
markroot(0xc208010000, 0x7fb100000005)
/usr/local/go/src/runtime/mgc0.c:556 +0xe7 fp=0x7fb18f645c88 sp=0x7fb18f645c28
runtime.parfordo(0xc208010000)
/usr/local/go/src/runtime/parfor.c:76 +0xb2 fp=0x7fb18f645d08 sp=0x7fb18f645c88
gc(0x7fb18f645e40)
/usr/local/go/src/runtime/mgc0.c:1442 +0x25e fp=0x7fb18f645e20 sp=0x7fb18f645d08
runtime.gc_m()
/usr/local/go/src/runtime/mgc0.c:1371 +0xe0 fp=0x7fb18f645e58 sp=0x7fb18f645e20
runtime.onM(0xc208012000)
/usr/local/go/src/runtime/asm_amd64.s:257 +0x68 fp=0x7fb18f645e60 sp=0x7fb18f645e58
runtime.mstart()
/usr/local/go/src/runtime/proc.c:818 fp=0x7fb18f645e68 sp=0x7fb18f645e60
goroutine 5 [garbage collection]:
runtime.switchtoM()
/usr/local/go/src/runtime/asm_amd64.s:198 fp=0xc208056ef0 sp=0xc208056ee8
runtime.gogc(0xc200000002)
/usr/local/go/src/runtime/malloc.go:469 +0x1cf fp=0xc208056f28 sp=0xc208056ef0
runtime.GC()
/usr/local/go/src/runtime/malloc.go:488 +0x26 fp=0xc208056f38 sp=0xc208056f28
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:28 +0x94 fp=0xc208056fe0 sp=0xc208056f38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc208056fe8 sp=0xc208056fe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 1 [syscall, locked to thread]:
runtime.cgocall_errno(0x402330, 0xc20801d588, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20801d548 sp=0xc20801d520
github.com/pebbe/zmq2._C2func_zmq_recv(0xb55690, 0xc20801d668, 0x0, 0x0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:145 +0x55 fp=0xc20801d588 sp=0xc20801d548
github.com/pebbe/zmq2.(*Socket).RecvBytes(0xc20803a2a0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:483 +0x2d7 fp=0xc20801d698 sp=0xc20801d588
github.com/pebbe/zmq2.(*Socket).Recv(0xc20803a2a0, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:460 +0x5f fp=0xc20801d700 sp=0xc20801d698
main.main()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:61 +0x132 fp=0xc20801d798 sp=0xc20801d700
runtime.main()
/usr/local/go/src/runtime/proc.go:63 +0xf3 fp=0xc20801d7e0 sp=0xc20801d798
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20801d7e8 sp=0xc20801d7e0
goroutine 2 [force gc (idle)]:
runtime.gopark(0x432440, 0x786140, 0x4fe530, 0xf)
/usr/local/go/src/runtime/proc.go:130 +0x105 fp=0xc20801a798 sp=0xc20801a768
runtime.goparkunlock(0x786140, 0x4fe530, 0xf)
/usr/local/go/src/runtime/proc.go:136 +0x48 fp=0xc20801a7c0 sp=0xc20801a798
runtime.forcegchelper()
/usr/local/go/src/runtime/proc.go:99 +0xce fp=0xc20801a7e0 sp=0xc20801a7c0
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20801a7e8 sp=0xc20801a7e0
created by runtime.init·4
/usr/local/go/src/runtime/proc.go:87 +0x25
goroutine 3 [GC sweep wait]:
runtime.gopark(0x432440, 0x78d3f0, 0x4faf90, 0xd)
/usr/local/go/src/runtime/proc.go:130 +0x105 fp=0xc20801df98 sp=0xc20801df68
runtime.goparkunlock(0x78d3f0, 0x4faf90, 0xd)
/usr/local/go/src/runtime/proc.go:136 +0x48 fp=0xc20801dfc0 sp=0xc20801df98
runtime.bgsweep()
/usr/local/go/src/runtime/mgc0.go:98 +0xbc fp=0xc20801dfe0 sp=0xc20801dfc0
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20801dfe8 sp=0xc20801dfe0
created by gc
/usr/local/go/src/runtime/mgc0.c:1386
goroutine 4 [finalizer wait]:
runtime.gopark(0x432440, 0x78d3e8, 0x4fe0b0, 0xe)
/usr/local/go/src/runtime/proc.go:130 +0x105 fp=0xc208018f30 sp=0xc208018f00
runtime.goparkunlock(0x78d3e8, 0x4fe0b0, 0xe)
/usr/local/go/src/runtime/proc.go:136 +0x48 fp=0xc208018f58 sp=0xc208018f30
runtime.runfinq()
/usr/local/go/src/runtime/malloc.go:727 +0xba fp=0xc208018fe0 sp=0xc208018f58
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc208018fe8 sp=0xc208018fe0
created by runtime.createfing
/usr/local/go/src/runtime/malloc.go:707 +0x5e
goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20805afe8 sp=0xc20805afe0
goroutine 6 [runnable, locked to thread]:
runtime.cgocall_errno(0x4021f0, 0xc208057eb0, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc208057e70 sp=0xc208057e48
github.com/pebbe/zmq2._C2func_zmq_connect(0x7fb1780008c0, 0x7fb178000e80, 0x7fb100000000, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:103 +0x55 fp=0xc208057eb0 sp=0xc208057e70
github.com/pebbe/zmq2.(*Socket).Connect(0xc20803a300, 0x50c110, 0x14, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:448 +0xd6 fp=0xc208057f38 sp=0xc208057eb0
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:24 +0x86 fp=0xc208057fe0 sp=0xc208057f38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc208057fe8 sp=0xc208057fe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 7 [runnable, locked to thread]:
runtime.cgocall_errno(0x4021f0, 0xc208059eb0, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc208059e70 sp=0xc208059e48
github.com/pebbe/zmq2._C2func_zmq_connect(0x7fb17c0008c0, 0x7fb17c000ed0, 0x7fb100000000, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:103 +0x55 fp=0xc208059eb0 sp=0xc208059e70
github.com/pebbe/zmq2.(*Socket).Connect(0xc20803a330, 0x50c110, 0x14, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:448 +0xd6 fp=0xc208059f38 sp=0xc208059eb0
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:24 +0x86 fp=0xc208059fe0 sp=0xc208059f38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc208059fe8 sp=0xc208059fe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 8 [runnable, locked to thread]:
runtime.cgocall_errno(0x4023d0, 0xc20801ae78, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20801ae38 sp=0xc20801ae10
github.com/pebbe/zmq2._C2func_zmq_socket(0xb52f30, 0xc200000003, 0x7fb1700008c0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:166 +0x56 fp=0xc20801ae78 sp=0xc20801ae38
github.com/pebbe/zmq2.(*Context).NewSocket(0xc20803a270, 0x3, 0xc20803a360, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:394 +0xbc fp=0xc20801af08 sp=0xc20801ae78
github.com/pebbe/zmq2.NewSocket(0x3, 0x0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:377 +0x46 fp=0xc20801af38 sp=0xc20801af08
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:21 +0x2f fp=0xc20801afe0 sp=0xc20801af38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20801afe8 sp=0xc20801afe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 9 [runnable, locked to thread]:
runtime.cgocall_errno(0x4021f0, 0xc20805beb0, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20805be70 sp=0xc20805be48
github.com/pebbe/zmq2._C2func_zmq_connect(0x7fb16c0008c0, 0x7fb16c000e80, 0x7fb100000000, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:103 +0x55 fp=0xc20805beb0 sp=0xc20805be70
github.com/pebbe/zmq2.(*Socket).Connect(0xc20803a390, 0x50c110, 0x14, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:448 +0xd6 fp=0xc20805bf38 sp=0xc20805beb0
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:24 +0x86 fp=0xc20805bfe0 sp=0xc20805bf38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20805bfe8 sp=0xc20805bfe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 10 [runnable, locked to thread]:
runtime.cgocall_errno(0x4023d0, 0xc20801be78, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20801be38 sp=0xc20801be10
github.com/pebbe/zmq2._C2func_zmq_socket(0xb52f30, 0xc200000003, 0x7fb1640008c0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:166 +0x56 fp=0xc20801be78 sp=0xc20801be38
github.com/pebbe/zmq2.(*Context).NewSocket(0xc20803a270, 0x3, 0xc20803a3c0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:394 +0xbc fp=0xc20801bf08 sp=0xc20801be78
github.com/pebbe/zmq2.NewSocket(0x3, 0x0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:377 +0x46 fp=0xc20801bf38 sp=0xc20801bf08
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:21 +0x2f fp=0xc20801bfe0 sp=0xc20801bf38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20801bfe8 sp=0xc20801bfe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 11 [runnable, locked to thread]:
runtime.cgocall_errno(0x4021f0, 0xc20805ceb0, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20805ce70 sp=0xc20805ce48
github.com/pebbe/zmq2._C2func_zmq_connect(0x7fb1680008c0, 0x7fb168000f10, 0x7fb100000000, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:103 +0x55 fp=0xc20805ceb0 sp=0xc20805ce70
github.com/pebbe/zmq2.(*Socket).Connect(0xc20803a3f0, 0x50c110, 0x14, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:448 +0xd6 fp=0xc20805cf38 sp=0xc20805ceb0
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:24 +0x86 fp=0xc20805cfe0 sp=0xc20805cf38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20805cfe8 sp=0xc20805cfe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 12 [runnable, locked to thread]:
runtime.cgocall_errno(0x4023d0, 0xc20801ce78, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20801ce38 sp=0xc20801ce10
github.com/pebbe/zmq2._C2func_zmq_socket(0xb52f30, 0xc200000003, 0x7fb15c0008c0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:166 +0x56 fp=0xc20801ce78 sp=0xc20801ce38
github.com/pebbe/zmq2.(*Context).NewSocket(0xc20803a270, 0x3, 0xc20803a420, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:394 +0xbc fp=0xc20801cf08 sp=0xc20801ce78
github.com/pebbe/zmq2.NewSocket(0x3, 0x0, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:377 +0x46 fp=0xc20801cf38 sp=0xc20801cf08
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:21 +0x2f fp=0xc20801cfe0 sp=0xc20801cf38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20801cfe8 sp=0xc20801cfe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 13 [runnable, locked to thread]:
runtime.cgocall_errno(0x4021f0, 0xc20805deb0, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc20805de70 sp=0xc20805de48
github.com/pebbe/zmq2._C2func_zmq_connect(0x7fb1600008c0, 0x7fb160000e80, 0x7fb100000000, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:103 +0x55 fp=0xc20805deb0 sp=0xc20805de70
github.com/pebbe/zmq2.(*Socket).Connect(0xc20803a450, 0x50c110, 0x14, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:448 +0xd6 fp=0xc20805df38 sp=0xc20805deb0
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:24 +0x86 fp=0xc20805dfe0 sp=0xc20805df38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc20805dfe8 sp=0xc20805dfe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
goroutine 14 [runnable, locked to thread]:
runtime.cgocall_errno(0x4021f0, 0xc2080bfeb0, 0x0)
/usr/local/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc2080bfe70 sp=0xc2080bfe48
github.com/pebbe/zmq2._C2func_zmq_connect(0x7fb1540008c0, 0x7fb154000e80, 0x7fb100000000, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/:103 +0x55 fp=0xc2080bfeb0 sp=0xc2080bfe70
github.com/pebbe/zmq2.(*Socket).Connect(0xc20803a480, 0x50c110, 0x14, 0x0, 0x0)
/home/mg/src/github.com/pebbe/zmq2/zmq2.go:448 +0xd6 fp=0xc2080bff38 sp=0xc2080bfeb0
main.worker_task()
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:24 +0x86 fp=0xc2080bffe0 sp=0xc2080bff38
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc2080bffe8 sp=0xc2080bffe0
created by main.main
/home/mg/src/github.com/pebbe/zmq2/examples/rtreq.go:54 +0xd7
'''