Red Hat Training

A Red Hat training course is available for RHEL 8

16.4. 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 comando set 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 16.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 16.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.