From: Austin Clements Date: Fri, 9 Sep 2016 14:22:10 +0000 (-0400) Subject: runtime: make gcDumpObject useful on stack frames X-Git-Tag: go1.8beta1~1067 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=38f1df66ff231458a81cb07e7b147f30854b45d4;p=gostls13.git runtime: make gcDumpObject useful on stack frames gcDumpObject is often used on a stack pointer (for example, when checkmark finds an unmarked object on the stack), but since stack spans don't have an elemsize, it doesn't print any of the memory from the frame. Make it at least slightly more useful by printing everything between obj and obj+off (inclusive). While we're here, also print out the span state. Change-Id: I51be064ea8791b4a365865bfdc7afa7b5aaecfbd Reviewed-on: https://go-review.googlesource.com/30142 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Rick Hudson --- diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 003073f42f..aa107ee65c 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -1320,9 +1320,22 @@ func gcDumpObject(label string, obj, off uintptr) { print(" s=nil\n") return } - print(" s.base()=", hex(s.base()), " s.limit=", hex(s.limit), " s.sizeclass=", s.sizeclass, " s.elemsize=", s.elemsize, "\n") + print(" s.base()=", hex(s.base()), " s.limit=", hex(s.limit), " s.sizeclass=", s.sizeclass, " s.elemsize=", s.elemsize, " s.state=") + if 0 <= s.state && int(s.state) < len(mSpanStateNames) { + print(mSpanStateNames[s.state], "\n") + } else { + print("unknown(", s.state, ")\n") + } + skipped := false - for i := uintptr(0); i < s.elemsize; i += sys.PtrSize { + size := s.elemsize + if s.state == _MSpanStack && size == 0 { + // We're printing something from a stack frame. We + // don't know how big it is, so just show up to an + // including off. + size = off + sys.PtrSize + } + for i := uintptr(0); i < size; i += sys.PtrSize { // For big objects, just print the beginning (because // that usually hints at the object's type) and the // fields around off. diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 808f141946..cc2de012ff 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -111,6 +111,15 @@ const ( _MSpanDead ) +// mSpanStateNames are the names of the span states, indexed by +// mSpanState. +var mSpanStateNames = []string{ + "_MSpanInUse", + "_MSpanStack", + "_MSpanFree", + "_MSpanDead", +} + // mSpanList heads a linked list of spans. // // Linked list structure is based on BSD's "tail queue" data structure.