2014-09-19 17 views
19

Zum Zwecke der Ablaufverfolgung, ich möchte aktuelle Funktionsname, wie die __FUNCTION__ Makro in gcc ausdrucken.golang: Aktuellen Umfang der Funktion Name

So dass, wenn ich eine Funktion

func foo() { 
    trace() 
} 

es automatisch so Entering foo()... oder etwas aus gedruckt werden.

Antwort

39

Paket runtime ist dein Freund hier:

func trace() { 
    pc := make([]uintptr, 10) // at least 1 entry needed 
    runtime.Callers(2, pc) 
    f := runtime.FuncForPC(pc[0]) 
    file, line := f.FileLine(pc[0]) 
    fmt.Printf("%s:%d %s\n", file, line, f.Name()) 
} 
+2

Oh, meine Güte, das ist Swank. Hatte keine Ahnung Laufzeit hat es so einfach gemacht. – twotwotwo

+1

Wow .. ich entweder. Ich muss meine Regex für die Stack-Trace zu diesem ändern .. es ist so viel schöner! +1 –

+0

Nur ein FYI - die Dokumentation sagt dies, aber das scheint ungenau. Ich rief diese 3 Methoden tief und es meldet Zeile 24 in der Quelldatei, wenn seine Zeile 22. Ich versuchte dann eine einzelne Methode Aufruf tief und es ist eine Zeile aus - nicht gut genug für meine Anforderungen :(Die Dokumentation heißt 'Das Ergebnis wird nicht genau sein, wenn pc kein Programmzähler innerhalb von f' ist, aber ich bin mir nicht sicher, wie ich das interpretieren sollte.Sie scheint nicht so genau zu sein wie das Extrahieren der Datei- und Zeilennummer aus einer Stapelspur –

6

jene im Jahr 2017, diese Frage suchen einige golang Runtime-Funktionen hinzugefügt wurden, die Nummer mit der falschen Linie zu beschäftigen scheinen gedruckt.

func trace2() { 
    pc := make([]uintptr, 15) 
    n := runtime.Callers(2, pc) 
    frames := runtime.CallersFrames(pc[:n]) 
    frame, _ := frames.Next() 
    fmt.Printf("%s,:%d %s\n", frame.File, frame.Line, frame.Function) 
} 

Spielplatz: https://play.golang.org/p/z2kHQJoeUo