linux - Error de depuración remota con GDB
debugging virtual-machine (5)
1) Necesita un gdbserver adecuado para su máquina objetivo y su máquina host (la que se ajusta a la máquina objetivo en su caso.
Digamos que quiero depurar un objetivo ppc desde un host x86:
Necesitaré en mi objetivo un gdbserver ejecutable de ppc.
Necesitaré en mi host un ejecutable x86 gdb para powerpc.
Una vez que esté configurado con esas cosas, debe hacer lo siguiente desde su host gdb antes de conectarse al destino en caso de que use bibliotecas compartidas:
establecer solib-absolute-prefix $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE
dir $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE
de lo contrario, el host gdb se volverá loco al intentar cargar libs compartidos para x86.
Intenté depurar remotamente una aplicación de 32 bits en x86_64 suse linux, pero obtuve este error "registro remoto mal formateado".
Inicié el gdbserver como escuchando en el puerto 12345 (gdbserver localhost: 12345 my_prog)
Y este es el error:
$ gdb
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
(gdb) target remote <ip>:12345
Remote debugging using <ip>:12345
Remote register badly formatted: T0506:0000000000000000;07:80b8bcff00000000;10:4028f0f700000000;
here: 0000000;07:80b8bcff00000000;10:4028f0f700000000;
(gdb)
Esta es la máquina del servidor de depuración (uname -a):
Servidor Linux 2.6.16.60-0.31-smp # 1 SMP Martes 7 de octubre 16:16:29 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux
Y esta es la máquina del cliente de depuración (uname -a):
Cliente Linux 2.6.16.54-0.2.5-default # 1 Lun ene 21 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux
Ambas máquinas se están ejecutando en máquinas virtuales (VMWare). El binario de gdbserver se copia de la máquina del cliente a la máquina del servidor.
(Remoto de depuración porque el entorno de ejecución en el servidor de depuración es similar a la producción, y no contiene ninguna herramienta de desarrollo, acceso al código fuente, etc.)
Cualquier sugerencia es bienvenida.
ACTUALIZACIÓN: esto funcionó para mí emitiendo el siguiente comando en gdb:
establecer la arquitectura i386: x86-64
Creo que necesita ejecutar gdb en su equipo host con una copia del programa de destino. Es decir, si ejecuta gdbserver myprog
en su máquina de destino, debe copiar sobre myprog
a la máquina host y ejecutar gdb myprog
.
De esta forma, gdb en la máquina host recogerá automáticamente la arquitectura del ejecutable. Ejecutar gdb en el host de esta manera también cargará los símbolos, sin los cuales obtendría símbolos sin resolver (signos de interrogación).
Quizás necesite ejecutar algo así como set architecture i386
en el indicador (gdb)
? ¿Qué dice show architecture
después de conectarse al objetivo remoto?
Quizás ya haya verificado esto, pero aquí va: - En la máquina de 64 bits, ¿tiene librerías de 32 bits (libc, etc.)? - ¿Has intentado ejecutar gdb con el modificador "-nx" (sin archivos de inicialización)?
Un GDB de 64 bits puede depurar directamente los procesos inferiores de 32 y 64 bits (creo que esto se llama soporte de múltiples arcos).
No es así con gdbserver
: no es compatible con la depuración de varios arcos.
Necesita un gdbserver
que coincida con la arquitectura de destino y gdb
que coincida con gdbserver
. Compilarlos desde la fuente, configurar con --target=i686
.