go badtraceback 源码

  • 2022-07-15
  • 浏览 (818)

golang badtraceback 代码

文件路径:/src/runtime/testdata/testprog/badtraceback.go

// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"runtime"
	"runtime/debug"
	"unsafe"
)

func init() {
	register("BadTraceback", BadTraceback)
}

func BadTraceback() {
	// Disable GC to prevent traceback at unexpected time.
	debug.SetGCPercent(-1)
	// Out of an abundance of caution, also make sure that there are
	// no GCs actively in progress.
	runtime.GC()

	// Run badLR1 on its own stack to minimize the stack size and
	// exercise the stack bounds logic in the hex dump.
	go badLR1()
	select {}
}

//go:noinline
func badLR1() {
	// We need two frames on LR machines because we'll smash this
	// frame's saved LR.
	badLR2(0)
}

//go:noinline
func badLR2(arg int) {
	// Smash the return PC or saved LR.
	lrOff := unsafe.Sizeof(uintptr(0))
	if runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" {
		lrOff = 32 // FIXED_FRAME or sys.MinFrameSize
	}
	lrPtr := (*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&arg)) - lrOff))
	*lrPtr = 0xbad

	// Print a backtrace. This should include diagnostics for the
	// bad return PC and a hex dump.
	panic("backtrace")
}

相关信息

go 源码目录

相关文章

go abort 源码

go checkptr 源码

go crash 源码

go crashdump 源码

go deadlock 源码

go gc 源码

go lockosthread 源码

go main 源码

go map 源码

go memprof 源码

0  赞