Source File
traceback.go
Belonging Package
runtime
package runtime
import (
)
const usesLR = sys.MinFrameSize > 0
.pc = 0
.fn = funcInfo{}
.argp = 0
.arglen = 0
.argmap = nil
} else {
.pc = .fn
:= findfunc(.pc)
if !.valid() {
print("runtime: unknown pc in defer ", hex(.pc), "\n")
throw("unknown pc")
}
.fn =
.argp = uintptr(deferArgs())
var bool
.arglen, .argmap, = getArgInfoFast(, true)
if ! {
.arglen, .argmap = getArgInfo(&, , true, )
}
}
.continpc = .pc
if !((*stkframe)(noescape(unsafe.Pointer(&))), ) {
return
}
}
}
const sizeofSkipFunction = 256
throw("gentraceback cannot trace user goroutine on its own stack")
}
, , := gotraceback()
var *funcval // Context pointer for unstarted goroutines. See issue #25897.
if == ^uintptr(0) && == ^uintptr(0) { // Signal to fetch saved values from gp.
if .syscallsp != 0 {
= .syscallpc
= .syscallsp
if usesLR {
= 0
}
} else {
= .sched.pc
= .sched.sp
if usesLR {
= .sched.lr
}
= (*funcval)(.sched.ctxt)
}
}
:= 0
var stkframe
.pc =
.sp =
if usesLR {
.lr =
}
:= false
:= .cgoCtxt
:= == nil && == nil
if .pc == 0 {
if usesLR {
.pc = *(*uintptr)(unsafe.Pointer(.sp))
.lr = 0
} else {
.pc = uintptr(*(*sys.Uintreg)(unsafe.Pointer(.sp)))
.sp += sys.RegSize
}
}
:= findfunc(.pc)
if !.valid() {
if != nil || {
print("runtime: unknown pc ", hex(.pc), "\n")
tracebackHexdump(.stack, &, 0)
}
if != nil {
throw("unknown pc")
}
return 0
}
.fn =
var pcvalueCache
:= funcID_normal
:= 0
= .fn
break
}
if != nil {
throw("traceback_arm: found jmpdefer when tracing with callback")
}
.lr = 0
} else {
var uintptr
if usesLR {
if == 0 && .sp < .fp || .lr == 0 {
= .sp
.lr = *(*uintptr)(unsafe.Pointer())
}
} else {
if .lr == 0 {
= .fp - sys.RegSize
.lr = uintptr(*(*sys.Uintreg)(unsafe.Pointer()))
}
}
= findfunc(.lr)
:=
if != nil || {
.argp = .fp + sys.MinFrameSize
var bool
.arglen, .argmap, = getArgInfoFast(, != nil)
if ! {
.arglen, .argmap = getArgInfo(&, , != nil, )
}
}
= nil // ctxt is only needed to get arg maps for the topmost frame
.continpc = .pc
if {
if .fn.deferreturn != 0 {
if ( == 0 && &_TraceTrap != 0) || || == .entry {
++
} else {
--
}
if := funcdata(, _FUNCDATA_InlTree); != nil {
:= (*[1 << 20]inlinedCall)()
for {
:= pcdatavalue(, _PCDATA_InlTreeIndex, , &)
if < 0 {
break
}
:= .pc
if ( > 0 || &_TraceTrap == 0) && .pc > .entry && ! {
--
if := funcdata(, _FUNCDATA_InlTree); != nil {
:= (*[1 << 20]inlinedCall)()
var _func
:= funcInfo{&, .datap}
for {
:= pcdatavalue(, _PCDATA_InlTreeIndex, , nil)
if < 0 {
break
}
:= funcname()
, := funcline(, )
if == "runtime.gopanic" {
= "panic"
}
print(, "(")
:= (*[100]uintptr)(unsafe.Pointer(.argp))
for := uintptr(0); < .arglen/sys.PtrSize; ++ {
if >= 10 {
print(", ...")
break
}
if != 0 {
print(", ")
}
print(hex([]))
}
print(")\n")
print("\t", , ":", )
if .pc > .entry {
print(" +", hex(.pc-.entry))
}
if .m != nil && .m.throwing > 0 && == .m.curg || >= 2 {
print(" fp=", hex(.fp), " sp=", hex(.sp), " pc=", hex(.pc))
}
print("\n")
++
}
= .funcID
}
++
if .funcID == funcID_cgocallback && len() > 0 {
:= [len()-1]
= [:len()-1]
if == 0 && == nil {
= tracebackCgoContext(, , , , )
}
}
= .funcID == funcID_sigpanic
:= || .funcID == funcID_asyncPreempt
if !.valid() {
break
}
switch funcname() {
var *reflectMethodValue
var bool
= (*reflectMethodValue)(unsafe.Pointer())
:= .sp + sys.MinFrameSize
func ( *uintptr, bool, uintptr, , int) int {
var [32]uintptr
cgoContextPCs(, [:])
var cgoSymbolizerArg
:= false
for , := range {
if == 0 || >= {
break
}
if != nil {
(*[1 << 20]uintptr)(unsafe.Pointer())[] =
}
if {
if cgoSymbolizer == nil {
print("non-Go function at pc=", hex(), "\n")
} else {
:= printOneCgoTraceback(, -, &)
+= - 1 // +1 a few lines down
= true
}
}
++
}
if {
.pc = 0
callCgoSymbolizer(&)
}
return
}
:= .gopc
:= findfunc()
if .valid() && showframe(, , false, funcID_normal, funcID_normal) && .goid != 1 {
printcreatedby1(, )
}
}
func ( funcInfo, uintptr) {
print("created by ", funcname(), "\n")
:= // back up to CALL instruction for funcline.
if > .entry {
-= sys.PCQuantum
}
, := funcline(, )
print("\t", , ":", )
if > .entry {
print(" +", hex(-.entry))
}
print("\n")
}
func (, , uintptr, *g) {
traceback1(, , , , 0)
}
traceback1(.m.libcallpc, .m.libcallsp, 0, .m.libcallg.ptr(), 0)
return
}
traceback1(, , , , _TraceTrap)
}
atomic.Store(&.m.cgoCallersUse, 1)
:= *.m.cgoCallers
.m.cgoCallers[0] = 0
atomic.Store(&.m.cgoCallersUse, 0)
printCgoTraceback(&)
}
var int
= .syscallpc
= .syscallsp
&^= _TraceTrap
= gentraceback(, , , , 0, nil, _TracebackMaxFrames, nil, nil, )
if == 0 && (&_TraceRuntimeFrames) == 0 {
= gentraceback(, , , , 0, nil, _TracebackMaxFrames, nil, nil, |_TraceRuntimeFrames)
}
if == _TracebackMaxFrames {
print("...additional frames elided...\n")
}
printcreatedby()
if .ancestors == nil {
return
}
for , := range *.ancestors {
printAncestorTraceback()
}
}
func ( ancestorInfo) {
print("[originating from goroutine ", .goid, "]:\n")
for , := range .pcs {
:= findfunc() // f previously validated
if showfuncinfo(, == 0, funcID_normal, funcID_normal) {
printAncestorTracebackFuncInfo(, )
}
}
if len(.pcs) == _TracebackMaxFrames {
print("...additional frames elided...\n")
:= findfunc(.gopc)
if .valid() && showfuncinfo(, false, funcID_normal, funcID_normal) && .goid != 1 {
printcreatedby1(, .gopc)
}
}
func ( funcInfo, uintptr) {
:= funcname()
if := funcdata(, _FUNCDATA_InlTree); != nil {
:= (*[1 << 20]inlinedCall)()
:= pcdatavalue(, _PCDATA_InlTreeIndex, , nil)
if >= 0 {
= funcnameFromNameoff(, [].func_)
}
}
, := funcline(, )
if == "runtime.gopanic" {
= "panic"
}
print(, "(...)\n")
print("\t", , ":", )
if > .entry {
print(" +", hex(-.entry))
}
print("\n")
}
func ( int, []uintptr) int {
:= getcallersp()
:= getcallerpc()
:= getg()
var int
systemstack(func() {
= gentraceback(, , 0, , , &[0], len(), nil, nil, 0)
})
return
}
func ( *g, int, []uintptr) int {
return gentraceback(^uintptr(0), ^uintptr(0), 0, , , &[0], len(), nil, nil, 0)
}
, , := gotraceback()
return true
}
if !.valid() {
return false
}
if == funcID_wrapper && elideWrapperCalling() {
return false
}
:= funcname()
if == "runtime.gopanic" && ! {
return true
}
return bytealg.IndexByteString(, '.') >= 0 && (!hasPrefix(, "runtime.") || isExportedRuntime())
}
return !( == funcID_gopanic || == funcID_sigpanic || == funcID_panicwrap)
}
var gStatusStrings = [...]string{
_Gidle: "idle",
_Grunnable: "runnable",
_Grunning: "running",
_Gsyscall: "syscall",
_Gwaiting: "waiting",
_Gdead: "dead",
_Gcopystack: "copystack",
_Gpreempted: "preempted",
}
func ( *g) {
:= readgstatus()
:= &_Gscan != 0
&^= _Gscan // drop the scan bit
var string
if 0 <= && < uint32(len(gStatusStrings)) {
= gStatusStrings[]
} else {
= "???"
}
if == _Gwaiting && .waitreason != waitReasonZero {
= .waitreason.String()
}
, := atomicAllG()
for := uintptr(0); < ; ++ {
:= atomicAllGIndex(, )
if == || == || readgstatus() == _Gdead || isSystemGoroutine(, false) && < 2 {
continue
}
print("\n")
func ( funcInfo, bool) bool {
return .funcID == funcID_goexit ||
.funcID == funcID_mstart ||
.funcID == funcID_mcall ||
.funcID == funcID_morestack ||
.funcID == funcID_rt0_go ||
( && .funcID == funcID_asmcgocall)
}
:= findfunc(.startpc)
if !.valid() {
return false
}
if .funcID == funcID_runtime_main || .funcID == funcID_handleAsyncEvent {
return false
}
return false
}
return !fingRunning
}
return hasPrefix(funcname(), "runtime.")
}
func ( int, , , unsafe.Pointer) {
if != 0 {
panic("unsupported version")
}
if cgoTraceback != nil && cgoTraceback != ||
cgoContext != nil && cgoContext != ||
cgoSymbolizer != nil && cgoSymbolizer != {
panic("call SetCgoTraceback only once")
}
cgoTraceback =
cgoContext =
cgoSymbolizer =
if _cgo_set_context_function != nil {
cgocall(_cgo_set_context_function, )
}
}
var cgoTraceback unsafe.Pointer
var cgoContext unsafe.Pointer
var cgoSymbolizer unsafe.Pointer
type cgoTracebackArg struct {
context uintptr
sigContext uintptr
buf *uintptr
max uintptr
}
type cgoContextArg struct {
context uintptr
}
func ( *cgoCallers) {
if cgoSymbolizer == nil {
for , := range {
if == 0 {
break
}
print("non-Go function at pc=", hex(), "\n")
}
return
}
var cgoSymbolizerArg
for , := range {
if == 0 {
break
}
printOneCgoTraceback(, 0x7fffffff, &)
}
.pc = 0
callCgoSymbolizer(&)
}
func ( uintptr, int, *cgoSymbolizerArg) int {
:= 0
.pc =
for <= {
callCgoSymbolizer()
func ( *cgoSymbolizerArg) {
:= cgocall
= asmcgocall
}
if msanenabled {
msanwrite(unsafe.Pointer(), unsafe.Sizeof(cgoSymbolizerArg{}))
}
(cgoSymbolizer, noescape(unsafe.Pointer()))
}
func ( uintptr, []uintptr) {
if cgoTraceback == nil {
return
}
:= cgocall
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |