mirror of
https://github.com/golang/go
synced 2024-11-19 13:44:52 -07:00
runtime: replace system goroutine whitelist with symbol test
Currently isSystemGoroutine has a hard-coded list of known entry points into system goroutines. This list is annoying to maintain. For example, it's missing the ensureSigM goroutine. Replace it with a check that simply looks for any goroutine with runtime function as its entry point, with a few exceptions. This also matches the definition recently added to the trace viewer (CL 81315). Change-Id: Iaed723d4a6e8c2ffb7c0c48fbac1688b00b30f01 Reviewed-on: https://go-review.googlesource.com/81655 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
a8a050819b
commit
44286b17c5
@ -13,6 +13,7 @@ type FuncID uint32
|
||||
|
||||
const (
|
||||
FuncID_normal FuncID = iota // not a special function
|
||||
FuncID_runtime_main
|
||||
FuncID_goexit
|
||||
FuncID_jmpdefer
|
||||
FuncID_mcall
|
||||
@ -22,9 +23,6 @@ const (
|
||||
FuncID_asmcgocall
|
||||
FuncID_sigpanic
|
||||
FuncID_runfinq
|
||||
FuncID_bgsweep
|
||||
FuncID_forcegchelper
|
||||
FuncID_timerproc
|
||||
FuncID_gcBgMarkWorker
|
||||
FuncID_systemstack_switch
|
||||
FuncID_systemstack
|
||||
|
@ -312,6 +312,8 @@ func (ctxt *Link) pclntab() {
|
||||
// funcID uint32
|
||||
funcID := objabi.FuncID_normal
|
||||
switch s.Name {
|
||||
case "runtime.main":
|
||||
funcID = objabi.FuncID_runtime_main
|
||||
case "runtime.goexit":
|
||||
funcID = objabi.FuncID_goexit
|
||||
case "runtime.jmpdefer":
|
||||
@ -330,12 +332,6 @@ func (ctxt *Link) pclntab() {
|
||||
funcID = objabi.FuncID_sigpanic
|
||||
case "runtime.runfinq":
|
||||
funcID = objabi.FuncID_runfinq
|
||||
case "runtime.bgsweep":
|
||||
funcID = objabi.FuncID_bgsweep
|
||||
case "runtime.forcegchelper":
|
||||
funcID = objabi.FuncID_forcegchelper
|
||||
case "runtime.timerproc":
|
||||
funcID = objabi.FuncID_timerproc
|
||||
case "runtime.gcBgMarkWorker":
|
||||
funcID = objabi.FuncID_gcBgMarkWorker
|
||||
case "runtime.systemstack_switch":
|
||||
|
@ -576,7 +576,7 @@ func generateTrace(params *traceParams, consumer traceConsumer) error {
|
||||
|
||||
fname := stk[0].Fn
|
||||
info.name = fmt.Sprintf("G%v %s", newG, fname)
|
||||
info.isSystemG = strings.HasPrefix(fname, "runtime.") && fname != "runtime.main"
|
||||
info.isSystemG = isSystemGoroutine(fname)
|
||||
|
||||
ctx.gcount++
|
||||
setGState(ev, newG, gDead, gRunnable)
|
||||
@ -1125,6 +1125,12 @@ func (ctx *traceContext) buildBranch(parent frameNode, stk []*trace.Frame) int {
|
||||
return ctx.buildBranch(node, stk)
|
||||
}
|
||||
|
||||
func isSystemGoroutine(entryFn string) bool {
|
||||
// This mimics runtime.isSystemGoroutine as closely as
|
||||
// possible.
|
||||
return entryFn != "runtime.main" && strings.HasPrefix(entryFn, "runtime.")
|
||||
}
|
||||
|
||||
// firstTimestamp returns the timestamp of the first event record.
|
||||
func firstTimestamp() int64 {
|
||||
res, _ := parseTrace()
|
||||
|
@ -358,6 +358,7 @@ type funcID uint32
|
||||
|
||||
const (
|
||||
funcID_normal funcID = iota // not a special function
|
||||
funcID_runtime_main
|
||||
funcID_goexit
|
||||
funcID_jmpdefer
|
||||
funcID_mcall
|
||||
@ -367,9 +368,6 @@ const (
|
||||
funcID_asmcgocall
|
||||
funcID_sigpanic
|
||||
funcID_runfinq
|
||||
funcID_bgsweep
|
||||
funcID_forcegchelper
|
||||
funcID_timerproc
|
||||
funcID_gcBgMarkWorker
|
||||
funcID_systemstack_switch
|
||||
funcID_systemstack
|
||||
|
@ -990,18 +990,25 @@ func topofstack(f funcInfo, g0 bool) bool {
|
||||
(g0 && f.funcID == funcID_asmcgocall)
|
||||
}
|
||||
|
||||
// isSystemGoroutine reports whether the goroutine g must be omitted in
|
||||
// stack dumps and deadlock detector.
|
||||
// isSystemGoroutine reports whether the goroutine g must be omitted
|
||||
// in stack dumps and deadlock detector. This is any goroutine that
|
||||
// starts at a runtime.* entry point, except for runtime.main and
|
||||
// sometimes runtime.runfinq.
|
||||
func isSystemGoroutine(gp *g) bool {
|
||||
// Keep this in sync with cmd/trace/trace.go:isSystemGoroutine.
|
||||
f := findfunc(gp.startpc)
|
||||
if !f.valid() {
|
||||
return false
|
||||
}
|
||||
return f.funcID == funcID_runfinq && !fingRunning ||
|
||||
f.funcID == funcID_bgsweep ||
|
||||
f.funcID == funcID_forcegchelper ||
|
||||
f.funcID == funcID_timerproc ||
|
||||
f.funcID == funcID_gcBgMarkWorker
|
||||
if f.funcID == funcID_runtime_main {
|
||||
return false
|
||||
}
|
||||
if f.funcID == funcID_runfinq {
|
||||
// We include the finalizer goroutine if it's calling
|
||||
// back into user code.
|
||||
return !fingRunning
|
||||
}
|
||||
return hasprefix(funcname(f), "runtime.")
|
||||
}
|
||||
|
||||
// SetCgoTraceback records three C functions to use to gather
|
||||
|
Loading…
Reference in New Issue
Block a user