2014-09-19 13 views
19

Per motivi di traccia, mi piacerebbe stampare il nome della funzione corrente, come la macro __FUNCTION__ in gcc.golang: ottenere lo scopo corrente della funzione nome

In modo che quando ho una funzione

func foo() { 
    trace() 
} 

stamperà automaticamente Entering foo()... o qualcosa del genere.

risposta

39

pacchetto runtime è tuo amico qui:

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, Accidenti, che è Swank. Non avevo idea che il runtime lo rendesse così facile. – twotwotwo

+1

Wow .. me entrambi. Dovrò cambiare la mia regex per la traccia dello stack per questo ... è molto più bello! +1 –

+0

Solo una FYI - la documentazione lo dice, ma questo sembra inaccurato. Ho chiamato questo 3 metodi in profondità e riporta la riga 24 nel file sorgente quando è la sua riga 22. Ho quindi provato una singola chiamata di metodo in profondità ed è una linea spenta - non abbastanza per le mie esigenze :(La documentazione dice 'Il risultato non sarà accurato se il pc non è un contatore di programma all'interno di f' .. ma non sono sicuro di come dovrei interpretarlo. Non sembra accurato come estrarre il numero di file e di linea da una traccia dello stack –

6

per chi cerca in questa domanda nel 2017 sono state aggiunte alcune funzioni di runtime golang che sembrano a che fare con il numero di riga non corretta in fase di stampa.

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) 
} 

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

Problemi correlati