go / expert
Snippet
Extrahieren von Aufruf-Frames mit geringem Overhead mittels runtime.Callers und runtime.CallersFrames
Die direkte Zuweisung von Programmzählern mit runtime.Callers in Kombination mit runtime.CallersFrames bietet einen effizienten Mechanismus zum Erfassen strukturierter Aufrufstapel-Frames, ohne unformatierte String-Stapel aus runtime/debug.Stack parsen zu müssen.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package mainimport ("fmt""runtime")type TraceError struct {Msg stringFrames []runtime.Frame}func CaptureError(msg string) *TraceError {pc := make([]uintptr, 10)n := runtime.Callers(2, pc)frames := runtime.CallersFrames(pc[:n])var errFrames []runtime.Framefor {frame, more := frames.Next()errFrames = append(errFrames, frame)if !more {break}}return &TraceError{Msg: msg, Frames: errFrames}}func main() {err := CaptureError("critical system failure")fmt.Printf("Error: %s, Top frame: %s\n", err.Msg, err.Frames[0].Function)}
Erklärung
1
pc := make([]uintptr, 10)
Allokiert einen Puffer zum Halten von Programmzähler-Anweisungszeigern.
2
n := runtime.Callers(2, pc)
Füllt das Slice mit Stapel-Programmzählern und überspringt Anrufer, um das interne Frame-Setup zu ignorieren.
3
frames := runtime.CallersFrames(pc[:n])
Übersetzt rohe Programmzähler in strukturierte Funktionsnamen-, Datei- und Zeilendetails.