¿Incluir el código fuente de malloc.c en gdb?

3 minutos de lectura

avatar de usuario
Paschalis

¿Cómo puedo incluir/ver el código fuente de malloc en gdb?

Quiero hacer una ejecución paso a paso en gdby entrar en malloc.c código fuente cuando se llama a cualquiera de las funciones malloc.

Actualmente lo que dice gdb es:
malloc.c: No such file or directory.

Este tipo enfrentó el mismo problema, pero no mencionan una solución, es decir, cómo acceder al código fuente de malloc.

Estoy en Ubuntu server 14.04y ya he intentado instalar lo siguiente:
libc6-dbg, libc6-devy libc6-dbgsym. Ni siquiera sé si uno de estos paquetes podría ayudar, pero instalar el libc-dbgsym me da el siguiente error:

dpkg: error processing archive /var/cache/apt/archives/libc6-dbgsym_2.19-0ubuntu6.6_amd64.ddeb (--unpack):  trying to overwrite
    '/usr/lib/debug/usr/lib/x86_64-linux-gnu/audit/sotruss-lib.so', which
    is also in package libc6-dbg:amd64 2.19-0ubuntu6.6 dpkg-deb: error:
    subprocess paste was killed by signal (Broken pipe)

  • Debe encontrar o compilar una versión de depuración de las bibliotecas.

    – Martín James

    29 de abril de 2015 a las 22:26

  • @MartinJames ¡esa es la parte en la que estoy fallando! 🙁

    – Paschalis

    29/04/2015 a las 22:41

Lo siguiente funcionó para mí. No estoy seguro de si hay una mejor manera.

  1. Instale libc6-dbg (que ya ha hecho):
    sudo apt-get install libc6-dbg
  2. Instale el paquete elibc-source (ubuntu en realidad usa elibc): sudo apt-get install eglibc-source.
  3. Descomprima el archivo tar que se instaló en /usr/src/glibc: /usr/src/glibc $ sudo tar xvf eglibc-2.19.tar.xz
  4. Sube gdb y agrega la ruta a la fuente malloc: (gdb) dir /usr/src/glibc/eglibc-2.19/malloc

(gdb) m

13 caracteres *c = malloc(100);

(gdb) s

__GI___libc_malloc (bytes=100) en malloc.c:2876 2876

{

(gdb)

  • ¡Funciona como el encanto! Además, el paso 4 se puede agregar en .gdbinit!

    – Paschalis

    29 de abril de 2015 a las 23:26

  • ¡Genial! Un gotcha algo relacionado (que parece que conoces). Pero para los futuros lectores: No rompa malloc mismo como libc hace todo tipo de gimnasia de símbolos para que el malloc el símbolo no es el real malloc que se invoca. En su lugar, interrumpa a la persona que llama y entre en el malloc llamada.

    – Kaylum

    29/04/2015 a las 23:40

  • Para Ubuntu 18.04 usuarios, parece que eglibc-source ya no es una cosa. parece ser solo glibc-source ahora, basado en mi búsqueda a través de los repositorios.

    –Filip Kilibarda

    17 de junio de 2019 a las 1:32

avatar de usuario
Pedro

Gdb solo puede mostrar los códigos fuente porque los archivos binarios compilados por depuración contienen referencias entre el código binario y los archivos fuente.

malloc() está en la biblioteca C. En los sistemas normales, no se compila con metadatos de depuración y sus fuentes tampoco están instaladas en el sistema.

Pero son accesibles, solo necesita instalar las versiones de depuración de estas bibliotecas. Por ejemplo, en debian un apt-get install glibc-debug o similar lo hará. En SuSE, un zipper in libc6-debug (Afaik, tal vez los nombres exactos de los paquetes podrían ser un poco diferentes).

  • ¡Debería haber votado negativo solo porque dijiste “gdb no es un mago”!

    – Paschalis

    29/04/2015 a las 22:33

  • Bromas aparte, creo que hice eso. Estoy en Ubuntu, y creo libc6-dbg es el equivalente de lo que usted sugirió!

    – Paschalis

    29/04/2015 a las 22:34

  • @Paschalis Lo siento, no tuve ninguna intención negativa con eso. Eliminé esto de la respuesta.

    – peterh

    29/04/2015 a las 22:34


  • Estaba bromeando 🙂 He instalado una versión de depuración de libc. ¡Todavía no funciona! ¡Actualicé mi pregunta hace un tiempo!

    – Paschalis

    29/04/2015 a las 22:40


  • @Paschalis ¿La fuente glibc también está en su sistema? ¿Puedes ver sus archivos? Es grande.

    – peterh

    29/04/2015 a las 22:42

¿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