linux gdb shared-libraries gdbserver

linux - Depuración de bibliotecas compartidas con gdbserver



shared-libraries (4)

Buen día,

Si la variable ''debug-file-directory'' en GDB está configurada incorrectamente, los mensajes de error informados contienen: advertencia: no se puede encontrar la función del punto de enlace del enlazador dinámico.

El sistema de archivos raíz del destino se encuentra en mi PC host en / opt / arm-linux-gnueabihf-rootfs

Los siguientes dos comandos me ayudaron a obtener la depuración remota trabajando a través de gdbserver usando GDB (v7.11.1):

set debug-file-directory /opt/arm-linux-gnueabihf-rootfs/usr/lib/debug set sysroot /opt/arm-linux-gnueabihf-rootfs

Me he dado cuenta de que si ''sysroot'' tiene una barra inclinada en la ruta, entonces GDB no puede usarla. Verás esto (resultado incorrecto) luego de conectarte al objetivo remoto:

Reading /lib/ld-linux-armhf.so.3 from remote target...

o

Reading symbols from /opt/arm-linux-gnueabihf-rootfs/lib/ld-linux- armhf.so.3...(no debugging symbols found)...done

en lugar de la salida correcta:

Reading symbols from /opt/arm-linux-gnueabihf-rootfs/lib/ld-linux- armhf.so.3... Reading symbols from /opt/arm-linux-gnueabihf-rootfs/usr/lib/debug/ lib/arm-linux-gnueabihf/ld-2.23.so...done.

Saludos, Frikkie Thirion

Estoy usando gdbserver en Target y CodeSourcery IDE. Mi hardware es un gumstix con un omap3530.

Puedo acceder al código en mi aplicación principal, pero si intento ingresar a una función en una biblioteca compartida, obtengo una dirección de memoria y finaliza un depurador.

Esta es mi biblioteca que se compila y se copia a la carpeta / lib en el sistema de destino. (Tiene símbolos de depuración) He intentado usar el archivo .gbdinit para establecer solib-absolute-prefix / lib

Aquí están las advertencias del rastreo gdb:

903,056 13-gdb-set sysroot-on-target /lib 903,065 13^done 903,065 (gdb) 903,065 14-target-select remote 192.168.1.101:2345 903,114 =thread-group-started,id="i1",pid="42000" 903,114 =thread-created,id="1",group-id="i1" 903,115 15-list-thread-groups --available 903,120 16-list-thread-groups 903,128 &"warning: Unable to find dynamic linker breakpoint function./nGDB will be unable to debug shared library initializers/nand track explicitly loaded dynamic code." 903,128 &"/n"

Lo que lleva a

903,395 &"Error while mapping shared library sections:/n" 903,397 &"/lib/libCoreLib.so: Invalid argument./n" 903,399 =library-loaded,id="/lib/libCoreLib.so",target-name="/lib/libCoreLib.so",hostname="/lib/libCoreLib.so",low-address="0x0",high-address="0x0",symbols-loaded="0",thread-group="i1"


Problema similar se encontró durante la depuración. La depuración estaba colgando. La configuración es la siguiente

Anfitrión : Ubuntu 12.04LTS

IDE : Eclipse Kepler

Objetivo : Beaglebone Black / ARM A8

Sistema operativo : Angstrom

Solución

Actualizar bibliotecas e incluye

Seleccionar propiedades para el proyecto en Eclipse

  • C / C ++ General> Rutas y símbolos> (incluye TAB) GNU C> Agregar> Sistemas de archivos> /> usr Cambie de / usr / lib / gcc / i686-linux-gnu / 4/6 / include a / usr / arm- linux-gnueabi / include

  • C / C ++ General> Rutas y símbolos> (Incluir TAB) GNU C ++> Agregar>
    Sistemas de archivos> /> usr /usr/arm-linux-gnueabi/include/c++/4.6.3/arm-linux-gnueabi

  • C / C ++ General> Rutas y símbolos> (TABLA Pathways de biblioteca)> Agregar> Sistemas de archivos> /> usr / usr / arm-linux-gnueabi / lib


Puede depurar con la biblioteca instalada en su host, siempre que la máquina de depuración sea también la máquina de desarrollo. En ese caso, use set sysroot en lugar de establecer sysroot-on-target. Por ejemplo :

set sysroot /home/username/.../rootfs/

donde /home/username/.../rootfs/ contiene una copia de su sistema de archivos de destino

Creo que también deberías especificar / lugar de /lib


Objetivo con símbolos de depuración

Este es el método más simple para trabajar, y es especialmente útil cuando se está desarrollando una biblioteca compartida en particular.

Primero copie el ejecutable de prueba y la biblioteca compartida al destino con información de depuración:

Luego en el objetivo:

gdbserver --multi :1234 ./executable_name

Anfitrión:

arm-linux-gnueabihf-gdb -q -nh / -ex "target extended-remote target-hostname-or-ip:1234" / -ex "file ./executable_name" / -ex ''tb main'' / -ex ''c'' / -ex ''set solib-search-path .''

sharedlibrary libmylib.so también funciona.

El problema que tuve fue que gdbserver detiene en el cargador dinámico, antes que en main , y las bibliotecas dinámicas aún no se han cargado en ese punto, por lo que GDB aún no sabe dónde irán los símbolos en la memoria.

GDB parece tener algunos mecanismos para cargar automáticamente los símbolos de la biblioteca compartida, y si compilo para el host y ejecuto gdbserver localmente, no es necesario ejecutar en main . Pero en el objetivo ARM, eso es lo más confiable que se puede hacer.

Target gdbserver 7.12-6, host arm-linux-gnueabihf-gdb 7.6.1 desde Linaro.

Bibliotecas de destino sin símbolos de depuración

Es común eliminar las bibliotecas de destino antes de la implementación en los objetivos integrados, ya que la información de depuración las hace mucho más grandes.

Por ejemplo, Buildroot lo hace de forma predeterminada, pero puede deshabilitarlo con BR2_STRIP_none=y .

Puede identificar este escenario ejecutando:

info shared

Que muestra algo así como:

From To Syms Read Shared Object Library 0x00007ffff7df7f90 0x00007ffff7dfcdd7 Yes (*) target:/lib/ld64-uClibc.so.0 0x00007ffff7b3a9b0 0x00007ffff7bbe05d Yes (*) target:/lib/libc.so.0 (*): Shared library is missing debugging information.

entonces hay asteriscos ( * ) para ambas bibliotecas que dicen que falta información de depuración.

Si ese es el caso, entonces debe decirle a GDB que use las bibliotecas compartidas en el host antes de que se eliminen.

Buildroot, por ejemplo, nos lo facilita, ya que mantiene el directorio provisional que contiene las bibliotecas compartidas antes de que fueran eliminadas y en las mismas rutas relativas que en el destino:

set sysroot buildroot/output/staging/

Cuando se establece esta opción, gdb busca inmediatamente las bibliotecas en el host en lugar del destino, y encuentra /lib/libc.so.0 en la ruta buildroot/output/staging/ + /lib/libc.so.0 :

Reading symbols from buildroot/output/staging/lib/ld64-uClibc.so.0...done. Reading symbols from buildroot/output/staging/lib/libc.so.0...done.

TODO: no creo que pueda establecer más de una sysroot , por lo que todas sus bibliotecas compartidas deben colocarse en sus rutas relativas correctas como en la imagen de destino.

Si comprueba el mal sysroot predeterminado, verá:

show sysroot

dar:

target:

lo que significa que gdb busca bibliotecas compartidas en la raíz de destino / por defecto.