¿Cómo cargar símbolos de bibliotecas compartidas para la depuración a nivel de fuente remota con gdb y gdbserver?
linux debugging (2)
He instalado gdb y gdbserver en una placa ARM de angstrom linux (con acceso externo), y estoy intentando que la depuración de una biblioteca compartida funcione desde mi máquina local. Actualmente, si entro en el dispositivo, puedo ejecutar gdb y puedo hacer que todo funcione, incluso estableciendo un punto de interrupción, pulsando y haciendo un seguimiento.
Mi problema viene cuando trato de hacer lo mismo usando gdbserver y ejecutando gdb en mi equipo host para lograr lo mismo (eventualmente me gustaría hacer que esto funcione en eclipse, pero en gdb es lo suficientemente bueno por el momento).
Observé que cuando uso gdb en el servidor y ejecuto "información compartida", carga correctamente los archivos de símbolos (lectura de syms: yes para todos), que luego puedo depurar. No tuve tanta suerte al hacerlo de forma remota, usando "archivo de símbolos" o "directorio" o "compartido". Está obviamente viendo los archivos, pero no puedo conseguir que cargue ningún símbolo, incluso cuando especifico archivos remotos directamente. ¿Algún consejo sobre lo que puedo probar ahora?
Hay algunas maneras diferentes de que esto falle, pero el típico es que gdb recoja archivos locales en lugar de archivos del servidor.
También hay algunas formas diferentes de corregir esto, pero el más simple es hacerlo antes de invocar target remote
:
(gdb) set sysroot remote:
Esto le dice a gdb que busque archivos del sistema remoto. Si tienes información de depuración allí (que deduzco de tu publicación que lo haces), todo va a funcionar bien.
El problema típico de este enfoque es que requiere copiar datos del control remoto. Esto puede ser un dolor si tienes un enlace malo. En este caso, puede conservar una copia de los datos localmente y apuntar sysroot a la copia. Sin embargo, esto requiere un poco de atención para mantener las cosas sincronizadas.
Primero corra hacia main
, y luego set solib-search-path .
De lo contrario, gdbserver
detiene en el cargador dinámico, antes de que se puedan cargar las bibliotecas. Más detalles en: Depuración de bibliotecas compartidas con gdbserver