commit | 561ce92fa060f746a58c7301138f145632e79294 | [log] [tgz] |
---|---|---|
author | Dmitry Vyukov <dvyukov@google.com> | Mon Jan 26 21:44:06 2015 +0300 |
committer | Dmitry Vyukov <dvyukov@google.com> | Tue Jan 27 17:26:36 2015 +0000 |
tree | a45a8988f9fcee30f28a80c9984e456b600dd4dd | |
parent | 35b8e511c282a4d03f50dca0570a5f65795926b9 [diff] |
runtime: fix crash during heapdump runtime/debug test crashes with GOMAXPROCS>1: fatal error: unexpected signal during runtime execution [signal 0xb code=0x1 addr=0x0 pc=0x80521b8] runtime stack: runtime.throw(0x8195028, 0x2a) src/runtime/panic.go:508 +0x71 fp=0x18427f24 sp=0x18427f18 runtime.sigpanic() src/runtime/sigpanic_unix.go:12 +0x53 fp=0x18427f4c sp=0x18427f24 runtime.finq_callback(0x0, 0x0, 0x0, 0x8129140, 0x0) src/runtime/heapdump.go:410 +0x58 fp=0x18427f58 sp=0x18427f4c runtime.iterate_finq(0x81a6860) src/runtime/mfinal.go:89 +0x73 fp=0x18427f78 sp=0x18427f58 runtime.dumproots() src/runtime/heapdump.go:448 +0x17a fp=0x18427fa4 sp=0x18427f78 runtime.mdump() src/runtime/heapdump.go:652 +0xbc fp=0x18427fb4 sp=0x18427fa4 runtime.writeheapdump_m(0x3) This happens because runfinq goroutine nils some elements in allfin after execution of finalizers: // drop finalizer queue references to finalized object f.fn = nil f.arg = nil f.ot = nil Then heapdump crashes trying to dereference fn.fn here: func finq_callback(fn *funcval, obj unsafe.Pointer, nret uintptr, fint *_type, ot *ptrtype) { dumpint(tagQueuedFinalizer) dumpint(uint64(uintptr(obj))) dumpint(uint64(uintptr(unsafe.Pointer(fn)))) dumpint(uint64(uintptr(unsafe.Pointer(fn.fn)))) dumpint(uint64(uintptr(unsafe.Pointer(fint)))) dumpint(uint64(uintptr(unsafe.Pointer(ot)))) } Change-Id: I372433c964180d782967be63d4355e568666980d Reviewed-on: https://go-review.googlesource.com/3287 Reviewed-by: Keith Randall <khr@golang.org>
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
For documentation about how to install and use Go, visit https://golang.org/ or load doc/install-source.html in your web browser.
Our canonical Git repository is located at https://go.googlesource.com/go. (There is a mirror of the repository at https://github.com/golang/go.)
Please report issues here: https://golang.org/issue/new
Go is the work of hundreds of contributors. We appreciate your help!
To contribute, please read the contribution guidelines: https://golang.org/doc/contribute.html
Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file.
If you have just untarred a binary Go distribution, you need to set the environment variable $GOROOT to the full path of the go directory (the one containing this file). You can omit the variable if you unpack it into /usr/local/go, or if you rebuild from sources by running all.bash (see doc/install-source.html). You should also add the Go binary directory $GOROOT/bin to your shell's path.
For example, if you extracted the tar file into $HOME/go, you might put the following in your .profile:
export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin
See https://golang.org/doc/install or doc/install.html for more details.