Chapter 11. Compatibility-breaking changes in GDB
The version of GDB provided in Red Hat Enterprise Linux 8 contains a number of changes that break compatibility, especially for cases where the GDB output is read directly from the terminal. The following sections provide more details about these changes.
Parsing output of GDB is not recommended. Prefer scripts using the Python GDB API or the GDB Machine Interface (MI).
GDBserver now starts inferiors with shell
To enable expansion and variable substitution in inferior command line arguments, GDBserver now starts the inferior in a shell, same as GDB.
To disable using the shell:
When using the
target extended-remoteGDB command, disable shell with the
set startup-with-shell offcommand.
When using the
target remoteGDB command, disable shell with the
--no-startup-with-shelloption of GDBserver.
Example 11.1. Example of shell expansion in remote GDB inferiors
This example shows how running the
/bin/echo /* command through GDBserver differs on Red Hat Enterprise Linux versions 7 and 8:
On 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 /*' /*
On 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 support removed
Support for debugging Java programs compiled with the GNU Compiler for Java (
gcj) has been removed.
New syntax for symbol dumping maintenance commands
The symbol dumping maintenance commands syntax now includes options before file names. As a result, commands that worked with GDB in RHEL 7 do not work in RHEL 8.
As an example, the following command no longer stores symbols in a file, but produces an error message:
(gdb) maintenance print symbols /tmp/out main.c
The new syntax for the symbol dumping maintenance commands is:
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]
Thread numbers are no longer global
Previously, GDB used only global thread numbering. The numbering has been extended to be displayed per inferior in the form
inferior_num.thread_num, such as
2.1. As consequence, thread numbers in the
$_thread convenience variable and in the
InferiorThread.num Python attribute are no longer unique between inferiors.
GDB now stores a second thread ID per thread, called the global thread ID, which is the new equivalent of thread numbers in previous releases. To access the global thread number, use the
$_gthread convenience variable and
InferiorThread.global_num Python attribute.
For backwards compatibility, the Machine Interface (MI) thread IDs always contains the global IDs.
Example 11.2. Example of GDB thread number changes
On 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
On 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
Memory for value contents can be limited
Previously, GDB did not limit the amount of memory allocated for value contents. As a consequence, debugging incorrect programs could cause GDB to allocate too much memory. The
max-value-size setting has been added to enable limiting the amount of allocated memory. The default value of this limit is 64 KiB. As a result, GDB in Red Hat Enterprise Linux 8 will not display too large values, but report that the value is too large instead.
As an example, printing a value defined as
char s[128*1024]; produces different results:
On Red Hat Enterprise Linux 7,
$1 = 'A' <repeats 131072 times>
On Red Hat Enterprise Linux 8,
value requires 131072 bytes, which is more than max-value-size
Sun version of stabs format no longer supported
Support for the Sun version of the
stabs debug file format has been removed. The
stabs format produced by GCC in RHEL with the
gcc -gstabs option is still supported by GDB.
Sysroot handling changes
set sysroot path command specifies system root when searching for files needed for debugging. Directory names supplied to this command may now be prefixed with the string
target: to make GDB read the shared libraries from the target system (both local and remote). The formerly available
remote: prefix is now treated as
target:. Additionally, the default system root value has changed from empty string to
target: for backward compatibility.
The specified system root is prepended to the file name of the main executable, when GDB starts processes remotely, or when it attaches to already running processes (both local and remote). This means that for remote processes, the default value
target: makes GDB always try to load the debugging information from the remote system. To prevent this, run the
set sysroot command before the
target remote command so that local symbol files are found before the remote ones.
HISTSIZE no longer controls GDB command history size
Previously, GDB used the
HISTSIZE environment variable to determine how long command history should be kept. GDB has been changed to use the
GDBHISTSIZE environment variable instead. This variable is specific only to GDB. The possible values and their effects are:
- a positive number - use command history of this size,
-1or an empty string - keep history of all commands,
- non-numeric values - ignored.
Completion limiting added
The maximum number of candidates considered during completion can now be limited using the
set max-completions command. To show the current limit, run the
show max-completions command. The default value is 200. This limit prevents GDB from generating excessively large completion lists and becoming unresponsive.
As an example, the output after the input
p <tab><tab> is:
on RHEL 7:
Display all 29863 possibilities? (y or n)
on RHEL 8:
Display all 200 possibilities? (y or n)
HP-UX XDB compatibility mode removed
-xdb option for the HP-UX XDB compatibility mode has been removed from GDB.
Handling signals for threads
Previously, GDB could deliver a signal to the current thread instead of the thread for which the signal was actually sent. This bug has been fixed, and GDB now always passes the signal to the correct thread when resuming execution.
signal command now always correctly delivers the requested signal to the current thread. If the program is stopped for a signal and the user switched threads, GDB asks for confirmation.
Breakpoint modes always-inserted off and auto merged
breakpoint always-inserted setting has been changed. The
auto value and corresponding behavior has been removed. The default value is now
off. Additionally, the
off value now causes GDB to not remove breakpoints from the target until all threads stop.
remotebaud commands no longer supported
set remotebaud and
show remotebaud commands are no longer supported. Use the
set serial baud and
show serial baud commands instead.