20

¿Hay alguna manera de obtener la función que llama en el kernel de Linux? Sé __ func __ devuelve el nombre de la función que se está ejecutando. Busco a la función que llama "__ __ func"Llamante de función en el kernel de Linux

+2

Muahahahaaa. Jaja ... no sanamente. –

Respuesta

37

, usted puede obtener la persona que llama con __builtin_return_address(0).

La persona que llama es __builtin_return_address(1) y así sucesivamente.

Es una extensión del CCG, documentado en el manual de gcc: http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

Editar: probablemente debería señalar, que obtiene la dirección de la persona que llama. Si desea que el nombre de la función se puede imprimir con %pS, por ejemplo:

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

Si no desea imprimir, se puede utilizar kallsyms_lookup() etc.

+8

Eso es un jujitsu impresionante. –

+0

¿Necesita punteros de marco habilitados para usar esto? – Brad

+0

Sí, probablemente necesite punteros de marco. – mpe

4

Sea o no el marco son necesarios depende punteros en arco, IIRC. Para x86, ciertamente se desean aprovechar completamente estas características. También tenga en cuenta que la alineación puede sesgar la precisión de builtin_return_address por esta misma razón.

Si solo quiere un volcado de pila para ver cómo se llegó a algún lugar, mejor utilice la función dump_stack() que tratando de jugar con builtin_return_address.

5

También puede imprimir todo el contenido de la pila de llamadas llamando a dump_stack().

0

Para obtener el nombre de la función del llamante, se puede usar el siguiente comando printk.

printk ("Llamante es% pF \ n", __builtin_return_address (0));

Cuestiones relacionadas