¿Cómo usar el comando addr2line en Linux?

3 minutos de lectura

avatar de usuario
Prak

Estoy tratando de usar el comando addr2line en Unix, pero cada vez que da el mismo resultado que ??:0. Estoy dando el mando como addr2line -e a.out 0x4005BDC . Obtuve esta dirección mientras ejecutaba este ejecutable a.out con valgrind herramienta para encontrar la fuga de memoria. También compilé el código fuente con -g opción.

También puede usar gdb en lugar de addr2line para examinar la dirección de memoria. Cargue el archivo ejecutable en gdb e imprima el nombre de un símbolo que se almacena en la dirección. 16 Examen de la tabla de símbolos.

(gdb) info symbol 0x4005BDC 

  • Buena idea. Además, ejecutar el programa en gdb con un punto de interrupción en esa dirección y obtener el seguimiento podría brindar buena información sobre qué está sucediendo exactamente allí.

    – Estera

    4 de octubre de 2011 a las 14:08

  • Consulte también (gdb) línea de información * 0x4005BDC

    – usuario47559

    4 oct 2011 a las 15:01

  • La dirección del código (de la biblioteca) sería la misma o diferente, entre compilar con el indicador “-g” y sin el indicador.

    – WindChaser

    18/03/2016 a las 22:27

Debe especificar un compensar a addr2line, no a una dirección virtual (VA). Presumiblemente, si tuviera desactivada la aleatorización del espacio de direcciones, podría usar un VA completo, pero en la mayoría de los sistemas operativos modernos, los espacios de direcciones se aleatorizan para un nuevo proceso.

Dada la VA 0x4005BDC por valgrind, encuentre la dirección base de su proceso o biblioteca en la memoria. Hágalo examinando la /proc/<PID>/maps archivo mientras su programa se está ejecutando. La línea de interés es la text segmento de su proceso, que es identificable por los permisos r-xp y el nombre de su programa o biblioteca.

Digamos que el VA base es 0x0x4005000. Entonces encontraría la diferencia entre el VA suministrado por valgrind y el VA base: 0xbdc. Luego, proporcione eso a add2line:

addr2line -e a.out -j .text 0xbdc

Y mira si eso te da tu número de línea.

  • espera, ¿qué compensaciones? ¿No es addr2line solo toma direcciones de symtab (o dyntab)?

    – Alexander Malajov

    13 de marzo de 2013 a las 10:59

Así es exactamente como lo usas. Sin embargo, existe la posibilidad de que la dirección que tiene no se corresponda con algo directamente en su código fuente.

Por ejemplo:

$ cat t.c
#include <stdio.h>
int main()
{
    printf("hello\n");
    return 0;
}
$ gcc -g t.c
$ addr2line -e a.out 0x400534
/tmp/t.c:3
$ addr2line -e a.out 0x400550
??:0

0x400534 es la dirección de main en mi caso. 0x400408 es también una dirección de función válida en a.out, pero es un fragmento de código generado/importado por GCC, que no tiene información de depuración. (En este caso, __libc_csu_init. Puede ver el diseño de su ejecutable con readelf -a your_exe.)

Otras veces cuando addr2line fallará si incluye una biblioteca que no tiene información de depuración.

  • En mi código, estoy usando la biblioteca pthread y libconfing. No sé si estas bibliotecas tienen información de depuración o no.

    – Prak

    4 oct 2011 a las 15:41

avatar de usuario
Penghe Geng

Intenta agregar el -f Opción para mostrar los nombres de las funciones:

addr2line -f -e a.out 0x4005BDC

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad