| // Copyright 2025 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 ( |
| "fmt" |
| "internal/abi" |
| "runtime" |
| "unsafe" |
| ) |
| |
| func init() { |
| register("SetCgoTracebackNoCgo", SetCgoTracebackNoCgo) |
| } |
| |
| func cgoTraceback() { |
| panic("unexpectedly reached cgo traceback function") |
| } |
| |
| func cgoContext() { |
| panic("unexpectedly reached cgo context function") |
| } |
| |
| func cgoSymbolizer() { |
| panic("unexpectedly reached cgo symbolizer function") |
| } |
| |
| // SetCgoTraceback is a no-op in non-cgo binaries. |
| func SetCgoTracebackNoCgo() { |
| traceback := unsafe.Pointer(abi.FuncPCABIInternal(cgoTraceback)) |
| context := unsafe.Pointer(abi.FuncPCABIInternal(cgoContext)) |
| symbolizer := unsafe.Pointer(abi.FuncPCABIInternal(cgoSymbolizer)) |
| runtime.SetCgoTraceback(0, traceback, context, symbolizer) |
| |
| // In a cgo binary, runtime.(*Frames).Next calls the cgo symbolizer for |
| // any non-Go frames. Pass in a bogus frame to verify that Next does |
| // not attempt to call the cgo symbolizer, which would crash in a |
| // non-cgo binary like this one. |
| frames := runtime.CallersFrames([]uintptr{0x12345678}) |
| frames.Next() |
| |
| fmt.Println("OK") |
| } |