Capítulo 11. Cambios que rompen la compatibilidad en GDB
La versión de GDB provista en Red Hat Enterprise Linux 8 contiene un número de cambios que rompen la compatibilidad, especialmente para los casos donde la salida de GDB es leída directamente desde la terminal. Las siguientes secciones proporcionan más detalles sobre estos cambios.
No se recomienda analizar la salida de GDB. Prefiera las secuencias de comandos que utilizan la API de GDB de Python o la interfaz de máquina de GDB (MI).
GDBserver ahora arranca los inferiores con el shell
Para permitir la expansión y la sustitución de variables en los argumentos de la línea de comandos inferior, GDBserver ahora inicia el inferior en un shell, igual que GDB.
Para desactivar el uso del shell:
-
Cuando utilice el comando
target extended-remote
GDB, desactive el shell con el comandoset startup-with-shell off
. -
Cuando utilice el comando
target remote
GDB, desactive el shell con la opción--no-startup-with-shell
de GDBserver.
Ejemplo 11.1. Ejemplo de expansión del shell en las inferencias remotas de GDB
Este ejemplo muestra cómo la ejecución del comando /bin/echo /*
a través de GDBserver difiere en las versiones 7 y 8 de Red Hat Enterprise Linux:
En RHEL 7:
$ gdbserver --multi :1234 $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*' /*
En RHEL 8:
$ gdbserver --multi :1234 $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*' /bin /boot (...) /tmp /usr /var
gcj
soporte eliminado
Se ha eliminado el soporte para la depuración de programas Java compilados con el compilador GNU para Java (gcj
).
Nueva sintaxis para los comandos de mantenimiento de volcado de símbolos
La sintaxis de los comandos de mantenimiento de volcado de símbolos ahora incluye opciones antes de los nombres de los archivos. Como resultado, los comandos que funcionaban con GDB en RHEL 7 no funcionan en RHEL 8.
Como ejemplo, el siguiente comando ya no almacena los símbolos en un archivo, sino que produce un mensaje de error:
(gdb) mantenimiento imprimir símbolos /tmp/out main.c
La nueva sintaxis para los comandos de mantenimiento de volcado de símbolos es:
maint print symbols [-pc address] [--] [filename] maint print symbols [-objfile objfile] [-source source] [--] [filename] maint print psymbols [-objfile objfile] [-pc address] [--] [filename] maint print psymbols [-objfile objfile] [-source source] [--] [filename] maint print msymbols [-objfile objfile] [--] [filename]
Los números de hilo ya no son globales
Anteriormente, GDB sólo utilizaba la numeración global de los hilos. La numeración se ha ampliado para mostrarse por inferior en la forma inferior_num.thread_num
, como 2.1
. Como consecuencia, los números de hilos en la variable de conveniencia $_thread
y en el atributo Python InferiorThread.num
ya no son únicos entre inferiores.
GDB ahora almacena un segundo ID de hilo por hilo, llamado ID de hilo global, que es el nuevo equivalente a los números de hilo de las versiones anteriores. Para acceder al número de hilo global, utilice la variable de conveniencia $_gthread
y el atributo de Python InferiorThread.global_num
.
Por compatibilidad con el pasado, los ID de los hilos de la interfaz de la máquina (MI) siempre contienen los ID globales.
Ejemplo 11.2. Ejemplo de cambios en el número de hilos de GDB
En Red Hat Enterprise Linux 7:
# debuginfo-install coreutils $ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread' (...) Id Target Id Frame * 2 process 203923 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109 1 process 203914 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109 $1 = 2 (...) $2 = 1
En Red Hat Enterprise Linux 8:
# dnf debuginfo-install coreutils $ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread' (...) Id Target Id Frame 1.1 process 4106488 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109 * 2.1 process 4106494 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109 $1 = 1 (...) $2 = 1
La memoria para los contenidos de valores puede ser limitada
Anteriormente, GDB no limitaba la cantidad de memoria asignada para el contenido de los valores. Como consecuencia, la depuración de programas incorrectos podía hacer que GDB asignara demasiada memoria. Se ha añadido el ajuste max-value-size
para permitir limitar la cantidad de memoria asignada. El valor por defecto de este límite es de 64 KiB. Como resultado, GDB en Red Hat Enterprise Linux 8 no mostrará valores demasiado grandes, sino que informará que el valor es demasiado grande.
Como ejemplo, la impresión de un valor definido como char s[128*1024];
produce resultados diferentes:
-
En Red Hat Enterprise Linux 7,
$1 = 'A' <repeats 131072 times>
-
En Red Hat Enterprise Linux 8,
value requires 131072 bytes, which is more than max-value-size
Ya no se admite la versión Sun del formato stabs
Se ha eliminado el soporte para la versión de Sun del formato de archivo de depuración stabs
. El formato stabs
producido por GCC en RHEL con la opción gcc -gstabs
sigue siendo soportado por GDB.
Cambios en el manejo de Sysroot
El comando set sysroot path
especifica la raíz del sistema cuando se buscan los archivos necesarios para la depuración. Los nombres de directorios suministrados a este comando ahora pueden llevar como prefijo la cadena target:
para que GDB lea las bibliotecas compartidas del sistema de destino (tanto local como remoto). El prefijo anteriormente disponible remote:
se trata ahora como target:
. Además, el valor de la raíz del sistema por defecto ha cambiado de una cadena vacía a target:
por compatibilidad con versiones anteriores.
La raíz del sistema especificada se antepone al nombre del archivo del ejecutable principal, cuando GDB inicia procesos de forma remota, o cuando se adjunta a procesos ya en ejecución (tanto locales como remotos). Esto significa que para los procesos remotos, el valor por defecto target:
hace que GDB siempre intente cargar la información de depuración desde el sistema remoto. Para evitar esto, ejecute el comando set sysroot
antes del comando target remote
para que los archivos de símbolos locales se encuentren antes que los remotos.
HISTSIZE ya no controla el tamaño del historial de comandos de GDB
Anteriormente, GDB utilizaba la variable de entorno HISTSIZE
para determinar el tiempo que debía mantenerse el historial de comandos. GDB ha sido modificado para utilizar la variable de entorno GDBHISTSIZE
en su lugar. Esta variable es específica sólo para GDB. Los valores posibles y sus efectos son:
- un número positivo - utilizar el historial de comandos de este tamaño,
-
-1
o una cadena vacía - guarda el historial de todos los comandos, - valores no numéricos - se ignoran.
Limitación de finalización añadida
Ahora se puede limitar el número máximo de candidatos considerados durante la finalización mediante el comando set max-completions
. Para mostrar el límite actual, ejecute el comando show max-completions
. El valor por defecto es 200. Este límite evita que GDB genere listas de finalización excesivamente grandes y deje de responder.
Como ejemplo, la salida después de la entrada p <tab><tab>
es:
-
en RHEL 7
Display all 29863 possibilities? (y or n)
-
en RHEL 8
Display all 200 possibilities? (y or n)
Eliminado el modo de compatibilidad HP-UX XDB
La opción -xdb
para el modo de compatibilidad HP-UX XDB ha sido eliminada de GDB.
Manejo de señales para hilos
Anteriormente, GDB podía entregar una señal al hilo actual en lugar de al hilo para el que realmente se enviaba la señal. Este error ha sido corregido, y GDB ahora siempre pasa la señal al hilo correcto al reanudar la ejecución.
Además, el comando signal
ahora siempre entrega correctamente la señal solicitada al hilo actual. Si el programa se detiene por una señal y el usuario cambia de hilo, GDB pide confirmación.
Modos de puntos de interrupción siempre insertados y desactivados y auto fusionados
Se ha modificado el valor breakpoint always-inserted
. Se ha eliminado el valor auto
y el comportamiento correspondiente. El valor por defecto es ahora off
. Además, el valor off
ahora hace que GDB no elimine los puntos de interrupción del objetivo hasta que todos los hilos se detengan.
los comandos de remotebaud ya no son compatibles
Los comandos set remotebaud
y show remotebaud
ya no son compatibles. Utilice en su lugar los comandos set serial baud
y show serial baud
.