2010-08-27 7 views
7

Tengo el siguiente problema: cuando obtengo una traza inversa en C usando la función backtrace (3) los símbolos devuelven que el nombre de las funciones se puede determinar fácilmente con la biblioteca enana y dladdr (3).Cómo obtener el nombre de función de un puntero de función C

El problema es que si tengo un simple puntero de función (por ejemplo pasándolo & función) la dladdr + funciones enanos no pueden ayudar. Parece que el puntero es diferente del devuelto por backtrace (3) (no es extraño, ya que backtrace obtiene estos punteros de función directamente de la pila).

Mi pregunta es si hay algún método para resolver estos nombres también? Además, me gustaría saber exactamente cuál es la diferencia entre los dos indicadores.

Gracias!

ACTUALIZACIÓN:

La diferencia entre los punteros es bastante significativo:
El recibo con traza inversa es: 0x8048ca4
La versión puntero directo: 0x3ba838

Me parece que el segundo uno necesita un desplazamiento.

+0

¿Los punteros * son * muy * diferentes, o solo un poco? – bstpierre

+0

@bstpierre: actualizó la pregunta. – terminus

+1

Los punteros que se encuentran en la pila generalmente son la dirección de la instrucción justo después de la llamada a la función actual. Por lo general, no son lo mismo que los punteros a la entrada de cualquier función. – RBerteig

Respuesta

0

addr2line (1) puede ser justo lo que está buscando.

+0

Es muy bueno, pero dado que esto solo puede resolver el mismo tipo de puntero que ya puedo (el que se da por detrás). Además, esta es una función de línea de comandos y estoy buscando una solución 'programática'. – terminus

1

Adivinando las diferencias sustanciales en las direcciones típicas que citó, una es de una biblioteca compartida real, y la otra de su ejecutable principal. Leyendo entre las líneas de man page for dladdr(3), podría darse el caso de que si el símbolo no está ubicado en un módulo que fue cargado por dlopen(3), entonces no podrá reconstruir el archivo coincidente y los nombres de símbolos.

Supongo que no ha eliminado los símbolos de ningún módulo que le interese aquí, o todas las apuestas están desactivadas. Si el ejecutable tiene símbolos, entonces debería ser posible buscar uno que sea una coincidencia exacta para la dirección de cualquier función con nombre. Un puntero a una función es solo eso, después de todo.

+0

Ambos punteros en el ejemplo representan la misma función. – terminus

+0

Oh. Hmm. Eso pone una cara diferente en él ... No sé cómo la vinculación dinámica en realidad * se implementa * en * nix, pero si hay trozos de la biblioteca cargada, eso podría explicar todo. El puntero de función apunta a un apéndice que salta a la función real en la biblioteca, tal vez. – RBerteig

Cuestiones relacionadas