20

C'è un modo per ottenere il chiamante di funzione nel kernel di Linux? Conosco __ func __ restituisce il nome della funzione in esecuzione. Sto cercando la funzione che chiama "__ func __"Chiamata di funzione nel kernel linux

+2

Muahahahaaa. Haha ... non molto bene. –

risposta

37

è possibile ottenere il chiamante con __builtin_return_address(0).

Il chiamante del chiamante è __builtin_return_address(1) e così via.

E 'un'estensione GCC, documentata nel manuale di gcc: http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

Edit: Probabilmente dovrei sottolineare, che si ottiene l'indirizzo del chiamante. Se si desidera che il nome della funzione è possibile stampare con %pS, ad esempio:

printk("Caller is %pS\n", __builtin_return_address(0)); 

Se non si desidera stampare, è possibile utilizzare kallsyms_lookup() ecc

+8

È un fantastico jujitsu. –

+0

Hai bisogno di puntatori ai frame abilitati per usare questo? – Brad

+0

Sì, probabilmente hai bisogno di puntatori ai frame. – mpe

4

o meno incorniciano i puntatori sono necessari dipende su arco, IIRC. Per x86, sono certamente desiderati per sfruttare appieno queste funzionalità. Si noti inoltre che l'inlining può distorcere la precisione di builtin_return_address proprio per questo motivo.

Se si desidera semplicemente un dump di stack per vedere in che modo è stato raggiunto un determinato luogo, utilizzare la funzione dump_stack() in modo migliore di cercare di armeggiare con builtin_return_address.

5

È anche possibile stampare l'intero contenuto dello stack di chiamate chiamando dump_stack().

0

Per ottenere il nome della funzione del chiamante, è possibile utilizzare il seguente comando printk.

printk ("Il chiamante è% pF \ n", __builtin_return_address (0));