aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
AgeCommit message (Collapse)AuthorFilesLines
2020-03-03[gdb/testsuite] Fix mi-sym-info.exp with check-read1Tom de Vries2-2/+9
When running gdb.mi/mi-sym-info.exp with check-read1, we run into: ... FAIL: gdb.mi/mi-sym-info.exp: List all functions FAIL: gdb.mi/mi-sym-info.exp: List all variables ... The problem is that while the $mi_gdb_prompt is active, gdb_test_multiple is used without -prompt "$mi_gdb_prompt$", so it defaults to matching $gdb_prompt. Fix this by adding the missing gdb_test_multiple arguments. Reg-tested on x86_64-linux with make targets check and check-read1. gdb/testsuite/ChangeLog: 2020-03-03 Tom de Vries <tdevries@suse.de> * gdb.mi/mi-sym-info.exp: Add missing -prompt "$mi_gdb_prompt$" to gdb_test_multiple calls.
2020-03-02gdb: Allow GDB to _not_ load a previous command historyAndrew Burgess4-2/+165
This commit aims to give a cleaner mechanism by which the user can prevent GDB from trying to load any previous command history. Currently the user can change the path to the history file, either using a command line flag, or by setting the GDBHISTFILE environment variable, and if the path is set to a non-existent file, then obviously GDB wont load any command history. However, this feels like a bit of a bodge, I'd like to add an official mechanism by which we can disable command history loading. Why would we want to prevent command history loading? The specific use case I have is GDB starting with a CWD that is a network mounted directory, and there is no command history present. Still GDB will access the network in order to check for the file. In my particular use case I'm actually starting a large number of GDB instances in parallel, all in the same network mounted directory, the large number of network accesses looking for this file introduces a noticeable delay at GDB startup. The approach I'm proposing here is a slight adjustment to the current rules for setting up the history filename. Currently, if a user does this, they see an error: (gdb) set history filename Argument required (filename to set it to.). However, if a user does this: $ GDBHISTFILE= gdb --quiet (gdb) set history save on (gdb) q warning: Could not rename -gdb18416~ to : No such file or directory So, we already have a bug in this area. My plan is to allow the empty filename to be accepted, and for this to mean, neither load, nor save the command history. This does mean that we now have two mechanisms to prevent saving the command history: (gdb) set history filename or (gdb) set history save off But the only way to prevent loading the command history is to set the filename to the empty string _before_ you get to a GDB prompt, either using a command line option, or the environment variable. I've updated some of the show commands, for example this session: (gdb) set history filename (gdb) show history filename There is no filename currently set for recording the command history in. (gdb) show history save Saving of the history record on exit is off. (gdb) set history save on (gdb) show history save Saving of the history is disabled due to the value of 'history filename'. (gdb) set history filename /tmp/hist (gdb) show history save Saving of the history record on exit is on. I've updated the manual, and added some tests. gdb/ChangeLog: * NEWS: Mention new behaviour of the history filename. * top.c (write_history_p): Add comment. (show_write_history_p): Add header comment, give a different message when history writing is on, but the history filename is empty. (history_filename): Add comment. (history_filename_empty): New function. (show_history_filename): Add header comment, give a different message when the filename is empty. (init_history): Compare history_filename against nullptr, and only read history if the filename is not empty. (set_history_filename): Add header comment, and only make non-empty filenames absolute. (init_main): Make the filename argument to 'set history filename' optional. gdb/doc/ChangeLog: * gdb.texinfo (Command History): Extend description for GDBHISTFILE and GDBHISTSIZE, add detail about the filename for 'set history filename' being optional. Describe the effect of an empty history filename on 'set history save on'. gdb/testsuite/ChangeLog: * gdb.base/default.exp: Remove test of 'set history filename'. * gdb.base/gdbinit-history.exp: Add tests for setting the history filename to the empty string. * lib/gdb.exp (gdb_init): Unset environment variables GDBHISTFILE and GDBHISTSIZE. Change-Id: Ia586e4311182fac99113b60f11ef8a11fbd5450b
2020-03-02gdb/remote: Restore support for 'S' stop reply packetAndrew Burgess2-32/+53
With this commit: commit 5b6d1e4fa4fc6827c7b3f0e99ff120dfa14d65d2 Date: Fri Jan 10 20:06:08 2020 +0000 Multi-target support There was a regression in GDB's support for older aspects of the remote protocol. Specifically, when a target sends the 'S' stop reply packet (which doesn't include a thread-id) then GDB has to figure out which thread actually stopped. Before the above commit GDB figured this out by using inferior_ptid in process_stop_reply, which contained the ptid of the current process/thread. This would be fine for single threaded targets (which is the only place using an S packet makes sense), but in the general case, relying on inferior_ptid for processing a stop is wrong - there's no reason to believe that what was GDB's current thread will be the same thread that just stopped in the target. With the above commit the inferior_ptid now has the value null_ptid inside process_stop_reply, this can be seen in do_target_wait, where we call switch_to_inferior_no_thread before calling do_target_wait_1. The problem this causes can be seen in the new test that runs gdbserver using the flag --disable-packet=T, and causes GDB to throw this assertion: inferior.c:279: internal-error: inferior* find_inferior_pid(process_stratum_target*, int): Assertion `pid != 0' failed. A similar problem was fixed in this commit: commit 3cada74087687907311b52781354ff551e10a0ed Date: Thu Jan 11 00:23:04 2018 +0000 Fix backwards compatibility with old GDBservers (PR remote/22597) However, this commit deals with the case where the T packet doesn't include a thread-id, not the S packet case. This commit solves the problem providing a thread-id at the GDB side if the remote target doesn't provide one. The thread-id provided comes from remote_state::general_thread, however, though this does work, I don't think it is the ideal solution. The remote_state tracks two threads, the continue_thread and the general_thread, these are updated when GDB asks the remote target to switch threads. The general_thread is set before performing things like register or memory accesses, and the continue_thread is set before things like continue or step commands. Further, the general_thread is updated after a target stops to reference the thread that stopped. The first thing to note from the above description is that we have a cycle of dependency, when a T packet arrives without a thread-id we fill in the thread-id from the general_thread data. The thread-id from the stop event is then used to set the general_thread. This in itself feels a little weird. The second question is why use the general_thread at all? You'd think given how they are originally set that the continue thread would be a better choice. The problem with this is that the continue_thread, if the user just does "continue", will be set to the minus_one_ptid, in the remote protocol this means all threads. When the stop arrives with no thread-id and we use continue_thread we end up with a very similar assertion to before because we now end up trying to lookup a thread using the minus_one_ptid. By contrast, once GDB has connected to a remote target the general_thread will be set to a valid thread-id, after which, if the target is single threaded, and stop events arrive without a thread-id, everything works fine. There is one slight weirdness with the above behaviour though. When GDB first connects to the remote target inferior_ptid is null_ptid, however, upon connecting we query the remote for its threads. As the thread information arrives GDB adds the threads to its internal database, and this process involves setting inferior_ptid to the id of each new thread in turn. Once we know about all the threads we wait for a stop event from the remote target to indicate that GDB is now in control of the target. The problem is that after adding the new threads we don't reset inferior_ptid, and the code path we use to wait for a stop event from the target also doesn't reset inferior_ptid, so it turns out that during the initial connection inferior_ptid is not null_ptid. This is lucky, because during the initial connection the general_thread variable _is_ set to null_ptid. So, during the initial connection, if the first stop event is missing a thread-id then we "provide" a thead-id from general_thread. This turns out to be null_ptid meaning no thread-id is known, and then during process_stop_reply we fill in the missing thread-id using inferior_ptid. This was all discussed on the mailing list here: https://sourceware.org/ml/gdb-patches/2020-02/msg01011.html My proposal for a fix then is: 1. Move the call to switch_to_inferior_no_thread into do_target_wait_1, this means that in all cases where we are waiting for an inferior the inferior_ptid will be set to null_ptid. This is good as no wait code should rely on inferior_ptid. 2. Remove the use of general_thread from the 'T' packet processing. The general_thread read here was only ever correct by chance, and we shouldn't be using it this way. 3. Remove use of inferior_ptid from process_stop_event as this is wrong, and will always be null_ptid now anyway. 4. When a stop_event has null_ptid due to a lack of thread-id (either from a T packet or an S packet) then pick the first non exited thread in the target and use that. This will be fine for single threaded targets. A multi-thread or multi-inferior aware remote target should be using T packets with a thread-id, so we give a warning if the target is multi-threaded, and we are still missing a thread-id. 5. Extend the existing test that covered the T packet with missing thread-id to also cover the S packet. gdb/ChangeLog: * remote.c (remote_target::remote_parse_stop_reply): Don't use the general_thread if the stop reply is missing a thread-id. (remote_target::process_stop_reply): Use the first non-exited thread if the target didn't pass a thread-id. * infrun.c (do_target_wait): Move call to switch_to_inferior_no_thread to .... (do_target_wait_1): ... here. gdb/testsuite/ChangeLog: * gdb.server/stop-reply-no-thread.exp: Add test where T packet is disabled.
2020-03-02[gdb/testsuite] Add -lbl option in gdb_test_multipleTom de Vries3-53/+83
Add gdb_test_multiple option -lbl, that adds a regexp after the user code that reads one line, and discards it: ... -re "\r\n\[^\r\n\]*(?=\r\n)" { exp_continue } ... In order to be able to write: ... gdb_test_multiple "command" "testname" -lbl { ... } ... rewrite the promp_regexp argument usage into the similar: ... gdb_test_multiple "command" "testname" -prompt $prompt_regexp { ... } ... Build and reg-tested on x86_64-linux. Tested gdb.base/corefile-buildid.exp with both make targets check and check-read1. gdb/testsuite/ChangeLog: 2020-03-02 Pedro Alves <palves@redhat.com> Tom de Vries <tdevries@suse.de> * lib/gdb.exp (gdb_test_multiple): Handle prompt_regexp option using -prompt prefix, before user_code argument. Add -lbl option likewise. (skip_python_tests_prompt, skip_libstdcxx_probe_tests_prompt) (gdb_is_target_1): Add -prompt prefix and move to before user_code argument. * gdb.base/corefile-buildid.exp: Use -lbl option. Rewrite regexps to have "\r\n" at start-of-line, instead of at end-of-line.
2020-02-28Update libinproctrace.so path in lib/trace-support.expSimon Marchi2-1/+6
Following the move to gdbserver to the top-level, the path to libinproctrace.so in testsuite/lib/trace-support.exp is no longer valid. This can be observed by running: $ make check TESTS="gdb.trace/ftrace.exp" RUNTESTFLAGS="--target_board=native-gdbserver" ... ERROR: error copying "/home/smarchi/build/binutils-gdb/gdb/testsuite/../gdbserver/libinproctrace.so": no such file or directory Adjust the path to libinproctrace.so by adding a "..". With this patch, the test mentioned above runs fine. gdb/testsuite/ChangeLog: * lib/trace-support.exp (get_in_proc_agent): Adjust path to libinproctrace.so.
2020-02-28Fix SVE-related failure in gdb.arch/aarch64-fp.expLuis Machado2-6/+11
The gdb.arch/aarch64-fp.exp test assumes it is dealing with a regular SIMD target that exposes the V registers as raw registers. SVE-enabled targets turn the V registers into pseudo-registers. That is all fine, but the testcase uses the "info registers" command, which prints pseudo-register's contents twice. One for the hex format and another for the natural format of the type. (gdb) info registers v0 v0 {d = {f = {0x0, 0x0}, u = {0x1716151413121110, 0x1f1e1d1c1b1a1918}, s = {0x1716151413121110, 0x1f1e1d1c1b1a1918}}, s = {f = {0x0, 0x0, 0x0, 0x0}, u = {0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c}, s = {0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c}}, h = {f = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, u = {0x1110, 0x1312, 0x1514, 0x1716, 0x1918, 0x1b1a, 0x1d1c, 0x1f1e}, s = {0x1110, 0x1312, 0x1514, 0x1716, 0x1918, 0x1b1a, 0x1d1c, 0x1f1e}}, b = {u = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}, s = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}}, q = {u = {0x1f1e1d1c1b1a19181716151413121110}, s = {0x1f1e1d1c1b1a19181716151413121110}}} {d = {f = {1.846323925681849e-197, 8.5677456166123577e-159}, u = {1663540288323457296, 2242261671028070680}, s = {1663540288323457296, 2242261671028070680}}, s = {f = {1.84362032e-27, 4.84942184e-25, 1.27466897e-22, 3.34818801e-20}, u = {319951120, 387323156, 454695192, 522067228}, s = {319951120, 387323156, 454695192, 522067228}}, h = {f = {0.00061798, 0.00086308, 0.0012398, 0.00173, 0.0024872, 0.0034676, 0.0049896, 0.0069504}, u = {4368, 4882, 5396, 5910, 6424, 6938, 7452, 7966}, s = {4368, 4882, 5396, 5910, 6424, 6938, 7452, 7966}}, b = {u = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, s = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}}, q = {u = {41362427191743139026751447860679676176}, s = {41362427191743139026751447860679676176}}} (gdb) p/x $v0 $1 = {d = {f = {0x0, 0x0}, u = {0x1716151413121110, 0x1f1e1d1c1b1a1918}, s = {0x1716151413121110, 0x1f1e1d1c1b1a1918}}, s = {f = {0x0, 0x0, 0x0, 0x0}, u = {0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c}, s = {0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c}}, h = {f = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, u = {0x1110, 0x1312, 0x1514, 0x1716, 0x1918, 0x1b1a, 0x1d1c, 0x1f1e}, s = {0x1110, 0x1312, 0x1514, 0x1716, 0x1918, 0x1b1a, 0x1d1c, 0x1f1e}}, b = {u = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}, s = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}}, q = {u = {0x1f1e1d1c1b1a19181716151413121110}, s = {0x1f1e1d1c1b1a19181716151413121110}}} Since the testcase is not expecting that, we run into a couple failures: FAIL: gdb.arch/aarch64-fp.exp: check register v0 value FAIL: gdb.arch/aarch64-fp.exp: check register v1 value The following patch switches to using "p/x" for printing register values, which prints the values once with the hex format, instead of twice. gdb/testsuite/ChangeLog 2020-02-28 Luis Machado <luis.machado@linaro.org> * gdb.arch/aarch64-fp.exp: Switch from "info registers" command to "p/x".
2020-02-28Fix gdb.arch/aarch64-dbreg-contents.exp build failuresLuis Machado2-0/+9
I ran into the following failures when running tests under QEMU: -- gdb compile failed, binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c: In function 'set_watchpoint': binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c:41:29: error: storage size of 'dreg_state' isn't known struct user_hwdebug_state dreg_state; ^~~~~~~~~~ In file included from /usr/include/aarch64-linux-gnu/bits/types/struct_iovec.h:23:0, from /usr/include/aarch64-linux-gnu/sys/uio.h:23, from binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c:17: binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c:69:18: error: invalid use of undefined type 'struct user_hwdebug_state' iov.iov_len = (offsetof (struct user_hwdebug_state, dbg_regs) ^ binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c:74:5: warning: implicit declaration of function 'error'; did you mean 'errno'? [-Wimplicit-function-declaration] error (1, errno, "PTRACE_SETREGSET: NT_ARM_HW_WATCH"); ^~~~~ errno binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c: In function 'main': binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c:87:3: warning: implicit declaration of function 'atexit'; did you mean '_Exit'? [-Wimplicit-function-declaration] atexit (cleanup); ^~~~~~ _Exit binutils-gdb/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c:89:11: warning: implicit declaration of function 'fork' [-Wimplicit-function-declaration] child = fork (); ^~~~ -- The following patch fixes those by adding the necessary include files. With that said, the test doesn't pass at present. I'll have to investigate it a bit more. gdb/testsuite/ChangeLog: 2020-02-28 Luis Machado <luis.machado@linaro.org> * gdb.arch/aarch64-dbreg-contents.c: Include stdlib.h, unistd, asm/ptrace.h and error.h.
2020-02-28[gdb/testsuite] Fix psymtab expansion postponement in c-linkage-name.expTom de Vries4-26/+89
The test-case gdb.base/c-linkage-name.exp starts with the following test: ... gdb_test "print symada__cS" \ " = {a = 100829103}" \ "print symada__cS before partial symtab expansion" ... However, printing the state of the partial symtabs using maint info psymtabs shows that in fact the symtab has already been expanded: ... { psymtab c-linkage-name.c ((struct partial_symtab *) 0x1e27b40)^M readin yes^M ... This is due to set_initial_language, which looks up the main symbol, which expands the psymtab containing main. Fix this by moving all but main into a separate source file c-linkage-name-2.c. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-28 Tom de Vries <tdevries@suse.de> * gdb.base/c-linkage-name.c (main): Call do_something_other_cu. (struct wrapper, do_something, mundane/symada__cS): Move ... * gdb.base/c-linkage-name-2.c: ... here. New source file. * gdb.base/c-linkage-name.exp: Add verification of psymtab expansion. Update "print symada__cS before partial symtab expansion" regexp. Update breakpoint location. Flush symbol cache after expansion.
2020-02-28Harden gdb.arch/aarch64-pauth.exp and fix a failureLuis Machado2-1/+10
When running this testcase against a QEMU with PAC support, i noticed we were failing to recognize the additional [PAC] that is emitted in the backtrace, resulting in this failure: FAIL: gdb.arch/aarch64-pauth.exp: backtrace I've made the test use multi_line to make the pattern more clear. Tested against aarch64-linux-gnu with and without PAC support. gdb/testsuite/ChangeLog: 2020-02-28 Luis Machado <luis.machado@linaro.org> * gdb.arch/aarch64-pauth.exp: Recognize optional PAC output.
2020-02-27[gdb/testsuite] Remove unused globalsTom de Vries8-25/+12
Remove unused global variable declarations. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-27 Tom de Vries <tdevries@suse.de> * config/sid.exp: Remove unused globals. * gdb.base/attach.exp: Same. * gdb.base/catch-load.exp: Same. * gdb.base/dbx.exp: Same. * lib/gdb.exp: Same. * lib/mi-support.exp: Same. * lib/prompt.exp: Same.
2020-02-27[gdb/testsuite] Fix spawn in tuiterm.expTom de Vries2-1/+10
When running gdb.stabs/weird.exp by itself it passes, but if we run a gdb.tui test before it, we get: ... $ make check RUNTESTFLAGS="gdb.stabs/weird.exp gdb.tui/basic.exp" Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.tui/basic.exp ... Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.stabs/weird.exp ... ERROR: Couldn't make test case. -1 {spawn failed} ... In more detail, using -v: ... Executing on build: sed -f aout.sed weird.def weird.s (timeout = 300) builtin_spawn [open ...]^M pid is 19060 19061 -19060 -19061 spawn -open file10 failed, 1 can't read "spawn_out(slave,name)": \ no such variable, can't read "spawn_out(slave,name)": no such variable while executing "set gdb_spawn_name $spawn_out(slave,name)" (procedure "spawn" line 5) invoked from within "spawn -ignore SIGHUP -leaveopen file10" invoked from within "catch "spawn -ignore SIGHUP -leaveopen $id" result2" ERROR: Couldn't make test case. -1 {spawn failed} ... When running the gdb.tui test, spawn gets renamed to a local version from lib/tuiterm.exp. The local version calls expect's spawn, and then makes the local spawn_out(slave,name) variable accessible in the global variable gdb_spawn_name. However, the weird.exp test-case uses remote_exec build, which ends up using local_exec, which given that there's input/output redirection uses open: ... set result [catch {open "| ${commandline} $inp |& tee $outpf" RDONLY} id] ... followed by spawn using the -leaveopen option: ... set result [catch "spawn -ignore SIGHUP -leaveopen $id" result2] ... which apparently has the effect that spawn_out(slave,name) is not set. Fix this in the lib/tuiterm.exp local spawn proc by detecting the case that spawn_out(slave,name) is not set, and handling it accordingly. Tested gdb.stabs/weird.exp and gdb.tui/*.exp on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-27 Tom de Vries <tdevries@suse.de> * lib/tuiterm.exp (spawn): Handle case that spawn_out(slave,name) is not set.
2020-02-26Add debuginfod support to GDBAaron Merey3-0/+245
debuginfod is a lightweight web service that indexes ELF/DWARF debugging resources by build-id and serves them over HTTP. This patch enables GDB to query debuginfod servers for separate debug files and source code when it is otherwise not able to find them. GDB can be built with debuginfod using the --with-debuginfod configure option. This requires that libdebuginfod be installed and found at configure time. debuginfod is packaged with elfutils, starting with version 0.178. For more information see https://sourceware.org/elfutils/. Tested on x86_64 Fedora 31. gdb/ChangeLog: 2020-02-26 Aaron Merey <amerey@redhat.com> * Makefile.in: Handle optional debuginfod support. * NEWS: Update. * README: Add --with-debuginfod summary. * config.in: Regenerate. * configure: Regenerate. * configure.ac: Handle optional debuginfod support. * debuginfod-support.c: debuginfod helper functions. * debuginfod-support.h: Ditto. * doc/gdb.texinfo: Add --with-debuginfod to configure options summary. * dwarf2/read.c (dwarf2_get_dwz_file): Query debuginfod servers when a dwz file cannot be found. * elfread.c (elf_symfile_read): Query debuginfod servers when a debuginfo file cannot be found. * source.c (open_source_file): Query debuginfod servers when a source file cannot be found. * top.c (print_gdb_configuration): Include --{with,without}-debuginfod in the output. gdb/testsuite/ChangeLog: 2020-02-26 Aaron Merey <amerey@redhat.com> * gdb.debuginfod: New directory for debuginfod tests. * gdb.debuginfod/main.c: New test file. * gdb.debuginfod/fetch_src_and_symbols.exp: New tests.
2020-02-26[gdb] Don't set initial language if set manuallyTom de Vries3-0/+67
Initially, gdb sets the language to auto/c: ... $ gdb -q (gdb) show language The current source language is "auto; currently c". ... And after loading a c++ executable, that changes to auto/c++: ... (gdb) file a.out Reading symbols from a.out... (gdb) show language The current source language is "auto; currently c++". ... Now consider setting the language manually to c: ... $ gdb -q (gdb) show language The current source language is "auto; currently c". (gdb) set language c (gdb) show language The current source language is "c". ... The resulting language is manual/c. Surprisingly, a subsequent load of the c++ executable: ... (gdb) file a.out Reading symbols from a.out... (gdb) show language The current source language is "c++". ... gets us language manual/c++. Loading the file should get us either: - auto/c++, or - manual/c. That is, either the manual setting should be reset by loading, or the manual setting should persist. Fix this in the manual/c fashion. [ Though we could make some gdb setting to choose one or the other. ] Build and reg-tested on x86_64-linux. [ Note: In PR23710 comment 1 a cc1 binary is attached for which gdb is slow when loading and settting a breakpoint on do_rpo_vn: ... $ time.sh gdb cc1 -batch -ex "b do_rpo_vn" Breakpoint 1 at 0xd40e30: do_rpo_vn. (2 locations) maxmem: 1463496 real: 8.88 user: 8.59 system: 0.35 ... This fix enables a speedup by manually setting the language before loading, reducing executing time with ~17%, due to not having to load the full symtab containing main: ... $ time.sh gdb -iex "set language c++" cc1 -batch -ex "b do_rpo_vn" Breakpoint 1 at 0xd40e30: do_rpo_vn. (2 locations) maxmem: 1067308 real: 7.36 user: 7.14 system: 0.28 ... ] gdb/ChangeLog: 2020-02-26 Tom de Vries <tdevries@suse.de> PR gdb/25603 * symfile.c (set_initial_language): Exit-early if language_mode == language_mode_manual. gdb/testsuite/ChangeLog: 2020-02-26 Tom de Vries <tdevries@suse.de> PR gdb/25603 * gdb.base/persistent-lang.cc: New test. * gdb.base/persistent-lang.exp: New file.
2020-02-25gdb/fortran: Support negative array stride in one limited caseAndrew Burgess3-0/+10
This commit adds support for negative Fortran array strides in one limited case, that is the case of a single element array with a negative array stride. The changes in this commit will be required in order for more general negative array stride support to work correctly, however, right now other problems in GDB prevent negative array strides from working in the general case. The reason negative array strides don't currently work in the general case is that when dealing with such arrays, the base address for the objects data is actually the highest addressed element, subsequent elements are then accessed with a negative offset from that address, and GDB is not currently happy with this configuration. The changes here can be summarised as, stop treating signed values as unsigned, specifically, the array stride, and offsets calculated using the array stride. This issue was identified on the mailing list by Sergio: https://sourceware.org/ml/gdb-patches/2020-01/msg00360.html The test for this issue is a new one written by me as the copyright status of the original test is currently unknown. gdb/ChangeLog: * gdbtypes.c (create_array_type_with_stride): Handle negative array strides. * valarith.c (value_subscripted_rvalue): Likewise. gdb/testsuite/ChangeLog: * gdb.fortran/derived-type-striding.exp: Add a new test. * gdb.fortran/derived-type-striding.f90: Add pointer variable for new test.
2020-02-25gdb/testsuite: Remove source file path from test nameAndrew Burgess2-1/+6
Having paths in test names makes comparing test results from two separate runs (in different directories) harder. gdb/testsuite/ChangeLog: * gdb.base/cached-source-file.exp: Avoid source file paths in test names.
2020-02-25[gdb/testsuite] Remove gcc/93866 xfail in methods.expTom de Vries2-9/+13
The test-case gdb.go/methods.exp contains an xfail for PR gcc/93866. However, that PR has been marked resolved-wontfix, with clarification that the gccgo symbol names for methods are correct, even if they're not the same as for gc. Remove the xfail. Tested on x86_64-linux with gccgo-10. gdb/testsuite/ChangeLog: 2020-02-25 Tom de Vries <tdevries@suse.de> PR go/18926 * gdb.go/methods.exp: Remove gcc/93866 xfail.
2020-02-24[gdb] Ensure listing of unused static var in info localsTom de Vries3-0/+70
Consider a test-case compiled with -g: ... int main (void) { static int b = 2; return 0; } ... When running info locals in main, we get: ... (gdb) info locals No locals. ... The info locals documentation states: ... Print the local variables of the selected frame, each on a separate line. These are all variables (declared either static or automatic) accessible at the point of execution of the selected frame. ... So, "info locals" should have printed static variable b. The variable is present in dwarf info: ... <2><14a>: Abbrev Number: 6 (DW_TAG_variable) <14b> DW_AT_name : b <153> DW_AT_const_value : 2 ... but instead of a location attribute, it has a const_value attribute, which causes the corresponding symbol to have LOC_CONST, which causes info locals to skip it. Fix this by handling LOC_CONST in iterate_over_block_locals. Build and reg-tested on x86_64-linux. gdb/ChangeLog: 2020-02-24 Tom de Vries <tdevries@suse.de> PR gdb/25592 * stack.c (iterate_over_block_locals): Handle LOC_CONST. gdb/testsuite/ChangeLog: 2020-02-24 Tom de Vries <tdevries@suse.de> PR gdb/25592 * gdb.base/info-locals-unused-static-var.c: New test. * gdb.base/info-locals-unused-static-var.exp: New file.
2020-02-22Allow TUI windows in PythonTom Tromey3-0/+93
This patch adds support for writing new TUI windows in Python. 2020-02-22 Tom Tromey <tom@tromey.com> * NEWS: Add entry for gdb.register_window_type. * tui/tui-layout.h (window_factory): New typedef. (tui_register_window): Declare. * tui/tui-layout.c (saved_tui_windows): New global. (tui_apply_current_layout): Use it. (tui_register_window): New function. * python/python.c (do_start_initialization): Call gdbpy_initialize_tui. (python_GdbMethods): Add "register_window_type" function. * python/python-internal.h (gdbpy_register_tui_window) (gdbpy_initialize_tui): Declare. * python/py-tui.c: New file. * Makefile.in (SUBDIR_PYTHON_SRCS): Add py-tui.c. gdb/doc/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * python.texi (Python API): Add menu item. (TUI Windows In Python): New node. gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.python/tui-window.exp: New file. * gdb.python/tui-window.py: New file. Change-Id: I85fbfb923a1840450a00a7dce113a05d7f048baa
2020-02-22Add horizontal splitting to TUI layoutTom Tromey2-1/+26
This changes the TUI layout engine to add horizontal splitting. Now, windows can be side-by-side. A horizontal split is defined using the "-horizontal" parameter to "tui new-layout". This also adds the first "winheight" test to the test suite. One open question is whether we want a new "winwidth" command, now that horizontal layouts are possible. This is easily done using the generic layout code. gdb/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> PR tui/17850: * tui/tui-win.c (tui_gen_win_info::max_width): New method. * tui/tui-layout.h (class tui_layout_base) <get_sizes>: Add "height" argument. (class tui_layout_window) <get_sizes>: Likewise. (class tui_layout_split) <tui_layout_split>: Add "vertical" argument. <get_sizes>: Add "height" argument. <m_vertical>: New field. * tui/tui-layout.c (tui_layout_split::clone): Update. (tui_layout_split::get_sizes): Add "height" argument. (tui_layout_split::adjust_size, tui_layout_split::apply): Update. (tui_new_layout_command): Parse "-horizontal". (_initialize_tui_layout): Update help string. (tui_layout_split::specification): Add "-horizontal" when needed. * tui/tui-layout.c (tui_layout_window::get_sizes): Add "height" argument. * tui/tui-data.h (struct tui_gen_win_info) <max_width, min_width>: New methods. gdb/doc/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> PR tui/17850: * gdb.texinfo (TUI Commands): Document horizontal layouts. gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> PR tui/17850: * gdb.tui/new-layout.exp: Add horizontal layout and winheight tests. Change-Id: I38b35e504f34698578af86686be03c0fefd954ae
2020-02-22Allow TUI sub-layouts in "new-layout" commandTom Tromey2-0/+15
The new TUI layout engine has support for "sub-layouts" -- this is a layout that includes another layout as a child. A sub-layout is treated as a unit when allocating space. There's not a very strong reason to use sub-layouts currently. This patch exists to introduce the idea, and to simplify the subsequent patch that adds horizontal layouts -- where sub-layouts are needed. Because this patch won't go in on its own, I chose to defer documenting this change until the subsequent horizontal layout patch. gdb/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * tui/tui-layout.h (class tui_layout_split) <add_split>: Change parameter and return types. (class tui_layout_base) <specification>: Add "depth". (class tui_layout_window) <specification>: Add "depth". (class tui_layout_split) <specification>: Add "depth". * tui/tui-layout.c (tui_layout_split::add_split): Change parameter and return types. (tui_new_layout_command): Parse sub-layouts. (_initialize_tui_layout): Update help string. (tui_layout_window::specification): Add "depth". (add_layout_command): Update. gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.tui/new-layout.exp: Add sub-layout tests. Change-Id: Iddf52d067a552c168b8a67f29caf7ac86404b10c
2020-02-22Add the "tui new-layout" commandTom Tromey2-0/+58
This adds a new command, "tui new-layout". This command can be used to define a new TUI window layout. The command is used like: (gdb) tui new-layout name src 1 regs 1 status 0 cmd 1 The first argument is the name of the layout. In this example, it is "name", so the new layout could be seen by "layout name". Subsequent arguments come in pairs, where the first item in a pair is the name of a window, and the second item in a pair is the window's weight. A weight is just an integer -- a window's allocated size is proportional to the total of the weights given. So, in the above example, all windows will have the same size (the status windows's weight does not matter, because it has fixed height). gdb/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * NEWS: Add "tui new-layout" item. * tui/tui-layout.c (add_layout_command): Return cmd_list_element. Add new-layout command to help text. (validate_window_name): New function. (tui_new_layout_command): New function. (_initialize_tui_layout): Register "new-layout". (tui_layout_window::specification): New method. (tui_layout_window::specification): New method. * tui/tui-layout.h (class tui_layout_base) <specification>: New method. (class tui_layout_window) <specification>: New method. (class tui_layout_split) <specification>: New method. gdb/doc/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.texinfo (TUI Overview): Mention user layouts. (TUI Commands): Document "tui new-layout". gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.tui/new-layout.exp: New file. Change-Id: Id7c3ace20ab1e8924f8f4ad788f40210f58a5c05
2020-02-22Style field names in "print"Tom Tromey5-0/+104
This changes gdb to use the "variable" style when printing field names. I've added new tests for C and Rust, but not other languages. I chose "variable" because that seemed most straightforward. However, another option would be to introduce a new "field" style. Similarly, this patch uses the variable style for enumerator constants -- but again, a new style could be used if that's preferred. gdb/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * valprint.c (generic_val_print_enum_1) (val_print_type_code_flags): Style member names. * rust-lang.c (val_print_struct, rust_print_enum) (rust_print_struct_def, rust_internal_print_type): Style member names. * p-valprint.c (pascal_object_print_value_fields): Style member names. Only call fprintf_symbol_filtered for static members. * m2-typeprint.c (m2_record_fields, m2_enum): Style member names. * f-valprint.c (f_val_print): Style member names. * f-typeprint.c (f_type_print_base): Style member names. * cp-valprint.c (cp_print_value_fields): Style member names. Only call fprintf_symbol_filtered for static members. (cp_print_class_member): Style member names. * c-typeprint.c (c_print_type_1, c_type_print_base_1): Style member names. * ada-valprint.c (ada_print_scalar): Style enum names. (ada_val_print_enum): Likewise. * ada-typeprint.c (print_enum_type): Style enum names. gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.rust/rust-style.rs: New file. * gdb.rust/rust-style.exp: New file. * gdb.base/style.exp: Test structure printing. * gdb.base/style.c (struct some_struct): New type. (enum etype): New type. (struct_value): New global. Change-Id: I070e1293c6cc830c9ea916af8243410aa384e944
2020-02-21[gdb/testsuite] Fix gdb.go/methods.expTom de Vries2-10/+74
With gccgo-6/7, we have: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo XFAIL: gdb.go/methods.exp: going to first breakpoint \ (the program exited) FAIL: gdb.go/methods.exp: setting breakpoint at (*main.T).Bar XFAIL: gdb.go/methods.exp: going to second breakpoint \ (the program is no longer running) ... And with gccgo-8/9/10, we have: ... PASS: gdb.go/methods.exp: setting breakpoint 1 XFAIL: gdb.go/methods.exp: going to first breakpoint FAIL: gdb.go/methods.exp: setting breakpoint at (*main.T).Bar XFAIL: gdb.go/methods.exp: going to second breakpoint \ (the program exited) ... The first test passes and fails with different messages: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo ... or: ... PASS: gdb.go/methods.exp: setting breakpoint 1 ... Fix this by removing the explicit pass call and using the message argument for gdb_breakpoint, for both breakpoint locations. The setup of the xfails is non-specific: ... setup_xfail "*-*-*" ;# mangling issues IIRC ... so let's start with removing these. The first FAIL with gccgo-6: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo ... is due an incorrect DW_AT_name attribute: ... # <554> DW_AT_name : main.Foo.N6_main.T ... Fix this by recognizing the incorrect attribute, and xfailing the test. Furthermore, if setting the breakpoint fails, there's not much point in trying to continue to the breakpoint: ... FAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo FAIL: gdb.go/methods.exp: going to first breakpoint (the program exited) ... Fix this by skipping the second test if the first one fails, also for the second breakpoint. With gccgo-10, we manage to set the first breakpoint, but continuing to breakpoint test fails: ... PASS: gdb.go/methods.exp: setting breakpoint 1 FAIL: gdb.go/methods.exp: going to first breakpoint ... This is due to an incorrect regexp, requiring a colon in front of the breakpoint location. Fix this for both breakpoints. Setting the second breakpoint fails: ... FAIL: gdb.go/methods.exp: setting breakpoint at (*main.T).Bar ... presumably because the breakpoint location "(*main.T).Bar" does not follow the naming convention explained at https://golang.org/doc/gdb#Naming. Fix this by updating the breakpoint location to "main.(*T).Bar". Still this test fails, for gccgo-6/7 because of an incorrect DW_AT_name attribute: ... # <529> DW_AT_name : main.Bar.pN6_main.T ... and for gccgo-8/9/10 because of incorrect DW_AT_name/DW_AT_linkage_name attributes (filed as gcc PR93866): ... # <6e5> DW_AT_name : main.Bar..1main.T # <6ec> DW_AT_linkage_name: main.T.Bar .. Add xfails for both of these. All in all, now we have with gccgo-6/7: ... XFAIL: gdb.go/methods.exp: setting breakpoint at main.T.Foo XFAIL: gdb.go/methods.exp: setting breakpoint at main.(*T).Bar ... and with gccgo-8/9/10, we have: ... PASS: gdb.go/methods.exp: setting breakpoint at main.T.Foo PASS: gdb.go/methods.exp: going to first breakpoint XFAIL: gdb.go/methods.exp: setting breakpoint at main.(*T).Bar ... Tested on x86_64-linux with gccgo-6/7/8/9/10. gdb/testsuite/ChangeLog: 2020-02-21 Tom de Vries <tdevries@suse.de> PR go/18926 * lib/gdb.exp (bp_location2/bp_location2_regexp): Fix. Remove blanket xfails. Use message argument for gdb_breakpoint. Make continuing to breakpoint test conditional on setting breakpoint. Fix continuing to breakpoint regexp. Add xfails for gccgo-6/7 DW_AT_name attribute. Add xfail for GCC PR93866.
2020-02-21gdb/testsuite: Add test for case where gdb_demangle returns NULLAndrew Burgess3-0/+130
This adds a test for the commit: commit 4f180d5396741eb65badba70cf5077b7d48f8641 Date: Fri Feb 21 08:19:21 2020 -0700 Check for null result from gdb_demangle gdb/testsuite/ChangeLog: * gdb.dwarf2/cpp-linkage-name.c: New file. * gdb.dwarf2/cpp-linkage-name.exp: New file.
2020-02-21Fix typo in gdb/testsuite/ChangeLogShahab Vahedi1-1/+1
The date of my last patch's entry in gdb/testsuite/ChangeLog was wrong. This fixes it.
2020-02-21gdb/testsuite: Regenerate the testglue if it is not inShahab Vahedi2-2/+17
For running the DejaGnu tests, some esoteric configurations may require a testglue. This, for instance, is true about testing ARC targets which uses its own DejaGnu board and a simulator which does not support returning the program's exit code. Therefore, for those tests that use "gdb_compile", a "gdb_tg.o" file is compiled and linked into the final executable. There are tests that invoke "gdb_compile" from different directories. Let's take a look at an example test: gdb.base/fullname.exp. The purpose of this test is to build the executable from different directories (absolute vs. relative vs. other) and then check if gdb can handle setting breakpoints accordingly. When "gdb_compile" generates the "gdb_tg.o", it does not do it again for the same test. Although this might seem efficient, it can lead to problems when changing directories before the next compile: gdb compile failed, arc-elf32-gcc: error: gdb_tg.o: No such file or directory This patch checks if the wrapper file ("gdb_tg.o") is still in reach and if it is not, it will stimulate the regeneration of the wrapper. It is worth mentioning that GCC's DejaGnu tests handle these scenarios as well and they seem to be more efficient in doing so by saving the library paths and manipulating them if necessary [1]. However, for GDB tests, that require less compilations, I think the proposed solution should be fine compared to a more full fledged solution from GCC. The glue file in our case is only 2 KiB. Last but not least, I ran the x86_64 tests on an x86_64 host and found no regression. [1] Avid coders may look for "set_ld_library_path_env_vars" in gcc/testsuite/lib/target-libpath.exp. gdb/testsuite/ChangeLog: * lib/gdb.exp (gdb_wrapper_init): Reset "gdb_wrapper_initialized" to 0 if "wrapper_file" does not exist.
2020-02-20[gdb/testsuite] Fix hello.go xpassTom de Vries5-11/+83
With gdb.go/hello.go, we run into an xpass: ... Thread 1 "hello" hit Breakpoint 1, main.main () at hello.go:7^M 7 func main () {^M (gdb) print st^M $1 = 0x0 ""^M (gdb) XPASS: gdb.go/hello.exp: starting string check ... The xfail is setup as follows: ... \# This used to print "", i.e., the local "st" initialized as "". setup_xfail "*-*-*" gdb_test "print st" \ ".* = $hex \"\"" \ "starting string check" ... It's not clear what gccgo/gc PR this xfail refers to. It's also not clear why the empty string is both: - listed as reason for xfail, and - used in the pass pattern. Furthermore, there's a comment in the hello.go testcase: ... st := "Hello, world!" // this intentionally shadows the global "st" ... while there's no global st variable present, only a variable myst: ... var myst = "Shall we?" ... Fix this by splitting up the test-case in two test-cases, hello.{go,exp} and global-local-var-shadow.{go,exp}. In hello.exp we no longer attempt to print st before its declaration. In hello.go we remove the myst variable as well the comment related to shadowing. In global-local-var-shadow.go, we rename myst to st, such that the comment related to shadowing is correct. In global-local-var-shadow.exp we attempt to print the value of st before the local definition, which should print the value of the global definition, and xfail this with reference to GCC PR93844. Tested on x86_64-linux, with gccgo 10. gdb/testsuite/ChangeLog: 2020-02-20 Tom de Vries <tdevries@suse.de> PR go/17018 * gdb.go/hello.exp: Copy ... * gdb.go/global-local-var-shadow.exp: ... here. New file. Expect print of st to print value of global definition. Add xfail for GCC PR93844. * gdb.go/hello.exp: Remove printing of st before definition. * gdb.go/hello.go: Copy ... * gdb.go/global-local-var-shadow.go: ... here. New test. Rename myst to st. * gdb.go/hello.go: Remove myst. Remove comment about shadowing.
2020-02-20[gdb/testsuite] Handle missing gccgoTom de Vries12-1/+46
Without gccgo installed I see in stdout/stderr: ... Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/print.exp ... Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/handcall.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/max-depth.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/integers.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/unsafe.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/package.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/types.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/chan.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/strings.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/basic-types.exp ... Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/hello.exp ... gdb compile failed, default_target_compile: Can't find gccgo. Running /data/gdb_versions/devel/src/gdb/testsuite/gdb.go/methods.exp ... gdb compile failed, default_target_compile: Can't find gccgo. ... Fix this by introducing a gdb_caching_proc support_go_compile, and using it in the complaining test-cases. Tested on x86_64-linux, with and without gccgo installed. gdb/testsuite/ChangeLog: 2020-02-20 Tom de Vries <tdevries@suse.de> * lib/gdb.exp (support_go_compile): New gdb_caching_proc. (gdb_simple_compile): Handle compile_flags go by using .go extension for source file. * gdb.go/chan.exp: Use support_go_compile. * gdb.go/handcall.exp: Same. * gdb.go/hello.exp: Same. * gdb.go/integers.exp: Same. * gdb.go/max-depth.exp: Same. * gdb.go/methods.exp: Same. * gdb.go/package.exp: Same. * gdb.go/strings.exp: Same. * gdb.go/types.exp: Same. * gdb.go/unsafe.exp: Same.
2020-02-19[gdb/testsuite] Fix xpass in gdb.python/lib-types.expTom de Vries2-2/+13
When running gdb.python/lib-types.exp, we have an xpass: ... (gdb) python print (str (typedef_const_typedef_class1_ref_obj.type))^M typedef_const_typedef_class1_ref^M (gdb) XPASS: gdb.python/lib-types.exp: \ python print (str (typedef_const_typedef_class1_ref_obj.type)) \ (PRMS gcc/55641) ... When running the same with gcc 4.8, we have an xfail instead: ... (gdb) python print (str (typedef_const_typedef_class1_ref_obj.type))^M const typedef_const_typedef_class1_ref^M (gdb) XFAIL: gdb.python/lib-types.exp: \ python print (str (typedef_const_typedef_class1_ref_obj.type)) \ (PRMS gcc/55641) ... Fix the xpass by xfailing only for the gcc 4.8 pattern. Tested on x86_64-linux, with: - gcc 7.5.0 - gcc 4.8.5 - clang 5.0.2 gdb/testsuite/ChangeLog: 2020-02-19 Tom de Vries <tdevries@suse.de> * gdb.python/lib-types.exp: Make xfail more strict.
2020-02-19[gdb/testsuite] Fix funcall_ref.exp xpassTom de Vries2-9/+28
When running gdb.ada/funcall_ref.exp I run into two XPASSes: ... (gdb) p get ("Hello world!")^M $1 = (n => 12, s => "Hello world!")^M (gdb) XPASS: gdb.ada/funcall_ref.exp: p get ("Hello world!") ptype get ("Hello world!")^M type = <ref> record^M n: natural;^M s: access array (1 .. n) of character;^M end record^M (gdb) XPASS: gdb.ada/funcall_ref.exp: ptype get ("Hello world!") ... The xfails are documented in funcall_ref.exp: ... # Currently, GCC describes such functions as returning pointers (instead of # references). setup_xfail *-*-* ... Using gnatmake 4.8, we can reproduce the XFAILs: ... (gdb) p get ("Hello world!")^M $1 = (access foo.bar) 0x6147b0 <system.secondary_stack.chunk+48>^M (gdb) XFAIL: gdb.ada/funcall_ref.exp: p get ("Hello world!") ptype get ("Hello world!")^M type = access record^M n: natural;^M s: access array (1 .. n) of character;^M end record^M (gdb) XFAIL: gdb.ada/funcall_ref.exp: ptype get ("Hello world!") ... Fix the XPASSes by: - removing the xfail setup - switching the order of the two tests - detecting the "access record" type and declaring the first test unsupported, and skipping the second test Tested on x86_64-linux, both with gnatmake 4.8.5 and gnatmake 7.5.0. gdb/testsuite/ChangeLog: 2020-02-19 Tom de Vries <tdevries@suse.de> * gdb.ada/funcall_ref.exp: Replace xfail setup by unsupported check.
2020-02-19rust/25535 Apply embedded offset to enum variant calculationDoug Evans3-0/+16
Hopefully straightforward (and I didn't miss anything ...). gdb/ChangeLog 2020-02-19 Doug Evans <dje@google.com> PR rust/25535 * rust-lang.c (rust_print_enum): Apply embedded_offset to rust_enum_variant calculation. gdb/testsuite/ChangeLog 2020-02-19 Doug Evans <dje@google.com> PR rust/25535 * gdb.rust/simple.exp: Add test. * gdb.rust/simple.rs: Add test.
2020-02-19[gdb/testsuite] Fix corefile-buildid.exp with check-read1Tom de Vries2-1/+53
When running gdb.base/corefile-buildid.exp using check-read1, I run into: ... FAIL: gdb.base/corefile-buildid.exp: shared: info files (timeout) FAIL: gdb.base/corefile-buildid.exp: symlink shared: info files (timeout) FAIL: gdb.base/corefile-buildid.exp: shared sepdebug: info files (timeout) FAIL: gdb.base/corefile-buildid.exp: symlink shared sepdebug: info files \ (timeout) ... This is caused by attempting to match the output of an "info files" command using a single gdb_test in check_exec_file. Fix this by doing line-by-line matching in check_exec_file. Tested on x86_64-linux, using make targets check and check-read1. gdb/testsuite/ChangeLog: 2020-02-19 Tom de Vries <tdevries@suse.de> * gdb.base/corefile-buildid.exp (check_exec_file): Match info files output line-by-line.
2020-02-19[gdb/testsuite] Fix c++/14186 kpass in cpexprs.expTom de Vries2-3/+4
With gdb.cp/cpexprs.exp, we see: ... KPASS: gdb.cp/cpexprs.exp: p CV::m(int) const (PRMS c++/14186) KPASS: gdb.cp/cpexprs.exp: p CV::m(int) volatile (PRMS c++/14186) KPASS: gdb.cp/cpexprs.exp: p CV::m(int) const volatile (PRMS c++/14186) ... The tests have been KPASSing since Sept 4 2017, due to commit 3693fdb3c8 'Make "p S::method() const::static_var" work too'. Fix this by removing the corresponding kfail. gdb/testsuite/ChangeLog: 2020-02-19 Tom de Vries <tdevries@suse.de> * gdb.cp/cpexprs.exp: Remove c++/14186 kfail.
2020-02-19[gdb/testsuite] Be quiet about missing prelink in solib-overlap.expTom de Vries2-2/+8
When running gdb.base/solib-overlap.exp, I get: ... Running src/gdb/testsuite/gdb.base/solib-overlap.exp ... sh: prelink: command not found === gdb Summary === nr of untested testcases 1 ... The verbose output on stdout/stderr is due to using system to execute prelink, which also means that the output is not captured in gdb.log and gdb.sum. Fix this by using exec instead of system. Tested on x86_64-linux, with: - no prelink installed, and - a fake prelink installed, using "cp /usr/bin/echo ~/bin/prelink". gdb/testsuite/ChangeLog: 2020-02-19 Tom de Vries <tdevries@suse.de> * gdb.base/solib-overlap.exp: Use exec instead of system to execute prelink.
2020-02-19[gdb/testsuite] Ignore pass in gdb_caching_procTom de Vries3-3/+38
Before commit d4295de4f3 "[gdb/testsuite] Handle missing gnatmake in gnat_runtime_has_debug_info", calling the gdb_caching_proc gnat_runtime_has_debug_info could generate a pass because of using gdb_compile_ada. This has been fixed in that commit by using a factored out variant gdb_compile_ada_1, which does not call pass. Additionally, fix cases like this in more generic way: by ignoring pass calls during execution of a gdb_caching_proc. Build and reg-tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-19 Tom de Vries <tdevries@suse.de> * lib/cache.exp (ignore_pass, gdb_do_cache_wrap): New proc. (gdb_do_cache): Use gdb_do_cache_wrap. * gdb.base/gdb-caching-proc.exp (test_proc): Use gdb_do_cache_wrap.
2020-02-19[gdb/testsuite] Be quiet about untested dtrace-prob.expTom de Vries2-2/+9
When running gdb.base/dtrace-probe.exp, I get this on stdout/stderr: ... Running src/gdb/testsuite/gdb.base/dtrace-probe.exp ... gdb compile failed, ld: error in \ build/gdb/testsuite/outputs/gdb.base/dtrace-probe/dtrace-probe.o\ (.eh_frame); no .eh_frame_hdr table will be created ld: crt1.o: in function `_start': start.S:110: undefined reference to `main' ld: build/gdb/testsuite/outputs/gdb.base/dtrace-probe/dtrace-probe-p.o:\ (.SUNW_dof+0x88): undefined reference to `main' ld: build/gdb/testsuite/outputs/gdb.base/dtrace-probe/dtrace-probe-p.o:\ (.SUNW_dof+0xb8): undefined reference to `main' collect2: error: ld returned 1 exit status === gdb Summary === nr of untested testcases 1 ... There is no reason to be this verbose about the failure to compile. Fix this by using quiet as additional option to gdb_compile in dtrace_build_usdt_test_program. Note that the error message still occurs in gdb.log. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-19 Tom de Vries <tdevries@suse.de> * lib/dtrace.exp (dtrace_build_usdt_test_program): Use quiet as gdb_compile option.
2020-02-18gdb: change print format of flag enums with value 0Simon Marchi2-1/+6
If a flag enum has value 0 and the enumeration type does not have an enumerator with value 0, we currently print: $1 = (unknown: 0x0) I don't like the display of "unknown" here, since for flags, 0 is a an expected value. It just means that no flags are set. This patch makes it so that we print it as a simple 0 in this situation: $1 = 0 If there is an enumerator with value 0, it is still printed using that enumerator, for example (from the test): $1 = FE_NONE gdb/ChangeLog: * valprint.c (generic_val_print_enum_1): When printing a flag enum with value 0 and there is no enumerator with value 0, print just "0" instead of "(unknown: 0x0)". gdb/testsuite/ChangeLog: * gdb.base/printcmds.exp (test_print_enums): Update expected output.
2020-02-18gdb: print unknown part of flag enum in hexSimon Marchi2-2/+7
When we print the "unknown" part of a flag enum, it is printed in decimal. I think it would be more useful if it was printed in hex, as it helps to determine which bits are set more than a decimal value. gdb/ChangeLog: * valprint.c (generic_val_print_enum_1): Print unknown part of flag enum in hex. gdb/testsuite/ChangeLog: * gdb.base/printcmds.exp (test_print_enums): Expect hex values for "unknown".
2020-02-18gdb: allow duplicate enumerators in flag enumsSimon Marchi2-3/+9
I have come across some uses cases where it would be desirable to treat an enum that has duplicate values as a "flag enum". For example, this one here [1]: enum membarrier_cmd { MEMBARRIER_CMD_QUERY = 0, MEMBARRIER_CMD_GLOBAL = (1 << 0), MEMBARRIER_CMD_GLOBAL_EXPEDITED = (1 << 1), MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = (1 << 2), MEMBARRIER_CMD_PRIVATE_EXPEDITED = (1 << 3), MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = (1 << 4), MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 5), MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 6), /* Alias for header backward compatibility. */ MEMBARRIER_CMD_SHARED = MEMBARRIER_CMD_GLOBAL, }; The last enumerator is kept for backwards compatibility. Without this patch, this enumeration wouldn't be considered a flag enum, because two enumerators collide. With this patch, it would be considered a flag enum, and the value 3 would be printed as: MEMBARRIER_CMD_GLOBAL | MEMBARRIER_CMD_GLOBAL_EXPEDITED Although if people prefer, we could display both MEMBARRIER_CMD_GLOBAL and MEMBARRIER_CMD_SHARED in the result. It wouldn't be wrong, and could perhaps be useful in case a bit may have multiple meanings (depending on some other bit value). [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/membarrier.h?id=0bf999f9c5e74c7ecf9dafb527146601e5c848b9#n125 gdb/ChangeLog: * dwarf2/read.c (update_enumeration_type_from_children): Allow flag enums to contain duplicate enumerators. * valprint.c (generic_val_print_enum_1): Update comment. gdb/testsuite/ChangeLog: * gdb.base/printcmds.c (enum flag_enum): Add FE_TWO_LEGACY enumerator.
2020-02-18gdb: fix printing of flag enums with multi-bit enumeratorsSimon Marchi3-5/+57
GDB has this feature where if an enum looks like it is meant to represent binary flags, it will present the values of that type as a bitwise OR of the flags that are set in the value. The original motivation for this patch is to fix this behavior: enum hello { AAA = 0x1, BBB = 0xf0 }; (gdb) p (enum hello) 0x11 $1 = (AAA | BBB) This is wrong because the bits set in BBB (0xf0) are not all set in the value 0x11, but GDB presents it as if they all were. I think that enumerations with enumerators that have more than one bit set should simply not qualify as "flag enum", as far as this heuristic is concerned. I'm not sure what it means to have flags of more than one bit. So this is what this patch implements. I have added an assert in generic_val_print_enum_1 to make sure the flag enum types respect that, in case they are used by other debug info readers, in the future. I've enhanced the gdb.base/printcmds.exp test to cover this case. I've also added tests for printing flag enums with value 0, both when the enumeration has and doesn't have an enumerator for value 0. gdb/ChangeLog: * dwarf2/read.c: Include "count-one-bits.h". (update_enumeration_type_from_children): If an enumerator has multiple bits set, don't treat the enumeration as a "flag enum". * valprint.c (generic_val_print_enum_1): Assert that enumerators of flag enums have 0 or 1 bit set. gdb/testsuite/ChangeLog: * gdb.base/printcmds.c (enum flag_enum): Prefix enumerators with FE_, add FE_NONE. (three): Update. (enum flag_enum_without_zero): New enum. (flag_enum_without_zero): New variable. (enum not_flag_enum): New enum. (three_not_flag): New variable. * gdb.base/printcmds.exp (test_artificial_arrays): Update. (test_print_enums): Add more tests for printing flag enums.
2020-02-18[gdb/testsuite] Handle missing gnatmake in gnat_runtime_has_debug_infoTom de Vries2-4/+19
After de-installing gnatmake, I get on stdout/stderr: ... Running src/gdb/testsuite/gdb.base/gdb-caching-proc.exp ... FAIL: gdb-caching-proc.exp: failed to compile gnat-debug-info test binary ... FAIL: gdb-caching-proc.exp: failed to compile gnat-debug-info test binary ... In gdb.sum, we see these FAILs (each paired with an UNSUPPORTED as well) followed by: ... PASS: gdb-caching-proc.exp: gnat_runtime_has_debug_info consistency ... Likewise, after re-installing gnatmake, I get a PASS for each of the UNSUPPORTEDs, and the FAILs disappear. The FAIL comes from gnat_runtime_has_debug_info, the PASS/UNSUPPORTED comes from gdb_compile_ada. Fix this by removing the corresponding fail call in gnat_runtime_has_debug_info, as well as using a new variant gdb_compile_ada_1 that doesn't call pass/unsupported. Tested on x86_64-linux, with gnatmake installed and de-installed. gdb/testsuite/ChangeLog: 2020-02-18 Tom de Vries <tdevries@suse.de> * lib/ada.exp (gdb_compile_ada_1): Factor out of ... (gdb_compile_ada): ... here. (gnat_runtime_has_debug_info): Remove fail call for gdb_compile_ada failure. Use gdb_compile_ada_1 instead of gdb_compile_ada.
2020-02-14Have testsuite find gdbserver in new locationTom Tromey3-7/+15
This updates the gdb testsuite to look for gdbserver in its new location. The old location is also checked for, on the theory that perhaps someone sets GDB to a full path for install testing. gdb/testsuite/ChangeLog 2020-02-14 Tom Tromey <tom@tromey.com> * lib/gdbserver-support.exp (find_gdbserver): Find gdbserver in build directory. * boards/gdbserver-base.exp: Update path to gdbserver. Change-Id: If03db762ba53882ddfaf2d2d516de14c3fa03938
2020-02-13[gdb/testsuite] Remove stale exec in gdb_compile_adaTom de Vries2-0/+6
When running test-case gdb.ada/ptype_tagged_param.exp, I get: ... PASS: gdb.ada/ptype_tagged_param.exp: compilation foo.adb ... However, when I then de-install gnatmake and run again, I get the same result. This is due to a stale exec. After removing the stale exec, I get: ... UNSUPPORTED: gdb.ada/ptype_tagged_param.exp: compilation foo.adb ... Fix this removing the stale exec in gdb_compile_ada before compilation. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-13 Tom de Vries <tdevries@suse.de> * lib/ada.exp (gdb_compile_ada): Delete stale exec before compilation.
2020-02-13[gdb/testsuite] Add unsupported tests in catch_ex_std.expTom de Vries2-0/+17
If I de-install gnatbind, I run into: ... FAIL: gdb.ada/catch_ex_std.exp: gnatbind foo ... Fix this by marking the test unsupported instead: ... UNSUPPORTED: gdb.ada/catch_ex_std.exp: gnatbind foo ... Likewise for gnatlink. Tested on x86_64-linux, with and without gnatbind/gnatlink installed. gdb/testsuite/ChangeLog: 2020-02-13 Tom de Vries <tdevries@suse.de> * gdb.ada/catch_ex_std.exp: Indicate unsupported if gnatbind/gnatlink are missing.
2020-02-13[gdb/testsuite] Fix gnatmake_version_at_leastTom de Vries2-1/+8
After de-installing gnatmake, I get: ... Running src/gdb/testsuite/gdb.ada/rename_subscript_param.exp ... ERROR: tcl error sourcing src/gdb/testsuite/gdb.ada/rename_subscript_param.exp. ERROR: couldn't execute "gnatmake": no such file or directory while executing "exec $gnatmake --version" (procedure "gnatmake_version_at_least" line 4) ... Fix this by wrapping the exec call in a catch call. Tested with and withouth gnatmake installed on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-13 Tom de Vries <tdevries@suse.de> * lib/ada.exp (gnatmake_version_at_least): Wrap exec call in a catch call.
2020-02-11New testcase for PR tui/25126 (staled source cache)Sergio Durigan Junior3-0/+148
I'm dealing with a Fedora GDB bug that is related to PR tui/25126, and I thought I'd write a specific testcase for it because I couldn't find one. The idea is to get the simple reproducer from the bug and tweak the testcase around it. This one was a bit hard because, since we need to modify the source file and recompile it, it involved a bit of TCL-foo to do things. Also for this reason, I'm only enabling the test for native boards. I tested this with an upstream GDB and made sure everything is passing. I also tested with a faulty GDB and made sure the test failed. gdb/testsuite/ChangeLog: 2020-02-11 Sergio Durigan Junior <sergiodj@redhat.com> PR tui/25126 https://bugzilla.redhat.com/show_bug.cgi?id=1784210 * gdb.base/cached-source-file.c: New file. * gdb.base/cached-source-file.exp: New file. Change-Id: Ib1b074342ebe8613c6d1dfde631691ebdf6d81c6
2020-02-11[gdb/testsuite] Fix UNRESOLVED in gdb.server/server-kill-python.expTom de Vries2-0/+9
The test-case gdb.server/server-kill-python.exp runs fine by itself: ... Running src/gdb/testsuite/gdb.server/server-kill-python.exp ... === gdb Summary === nr of expected passes 3 ... But if we run f.i. gdb.server/file-transfer.exp before it, we get instead: ... Running src/gdb/testsuite/gdb.server/server-kill-python.exp ... ERROR: GDB process no longer exists === gdb Summary === nr of expected passes 13 nr of unresolved testcases 1 ... We can see the origin of the problem here: ... spawn gdbserver --once localhost:2347 \ build/gdb/testsuite/outputs/gdb.server/file-transfer/file-transfer \ build/gdb/testsuite/outputs/gdb.server/server-kill-python/server-kill-python^M Process build/gdb/testsuite/outputs/gdb.server/file-transfer/file-transfer \ created; pid = 9464^M Listening on port 2347^M ... The spawn of the gdbserver for the server-kill-python test-case gets as executable argument the file-transfer binary. This is caused by proc gdbserver_spawn attempting to load the exec file in $file_last_loaded. This is something that is meant to load the same exec in the gdbserver that was earlier loaded into gdb. In this test-case however, nothing has been loaded into gdb by the test-case, and consequently we load the file that was loaded into gdb in the previous test-case. Fix this by unsetting $file_last_loaded in gdb_init. Build and reg-tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-11 Tom de Vries <tdevries@suse.de> PR testsuite/25488 * lib/gdb.exp (gdb_init): Unset $file_last_loaded. Change-Id: Ic385e08cbd34cbf85518720cf5695b4ff6619f4b
2020-02-10[gdb/testsuite] Skip multi-target.exp without gdbserverTom de Vries2-0/+8
Pre-commit 919adfe840 "Move gdbserver to top level", if we build gdb with --disable-gdbserver, and run test-case gdb.multi/multi-target.exp, we run into: ... (gdb) PASS: gdb.multi/multi-target.exp: continue: non-stop=off: set remote-exec file in inferior 2 spawn of --once --multi localhost:2346 failed ERROR: tcl error sourcing /data/gdb_versions/devel/src/gdb/testsuite/gdb.multi/multi-target.exp. ERROR: Timeout waiting for gdbserver response. ... Fix this by using skip_gdbserver_tests in multi-target.exp. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-10 Tom de Vries <tdevries@suse.de> * gdb.multi/multi-target.exp: Skip if skip_gdbserver_tests.
2020-02-10GDB/testsuite: Fix a catastrophic step-over-no-symbols.exp failureMaciej W. Rozycki2-1/+8
Fix a catastrophic failure in gdb.base/step-over-no-symbols.exp where remote target communication issues cause the value of the PC retrieved to be empty: (gdb) FAIL: gdb.base/step-over-no-symbols.exp: displaced=off: stepi p /x $pc Remote 'g' packet reply is too long (expected 264 bytes, got 532 bytes): 00000000000000002a6f61551500000080faffff3f0000000028010000000000b03857551500000060ad5f5515000000906e615515000000802401000000000090faffff3f00000000000000000000000100000000000000e8fbffff3f000000f8fbffff3f0000000000000000000000b8faffff3f0000008a05010000000000589c6f551500000056424d40435c2f7c1809575515000000f0e0baaa2a0000000000000000000000f0ffbaaa2a000000f0e0baaa2a0000006804baaa2a000000000000000000000000000000000000007053baaa2a0000008252b2aa2a00000090fe01000000000048e056551500000004000000000000004000000000000000920501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxxxxxx00000000 (gdb) FAIL: gdb.base/step-over-no-symbols.exp: displaced=off: get after PC ERROR: tcl error sourcing .../gdb/testsuite/gdb.base/step-over-no-symbols.exp. ERROR: missing operand at _@_ in expression " _@_!= " (parsing expression " != ") invoked from within "expr $before_addr != $after_addr" ("uplevel" body line 1) invoked from within "uplevel 1 expr $condition" (procedure "gdb_assert" line 6) invoked from within "gdb_assert {$before_addr != $after_addr} "advanced"" (procedure "test_step_over" line 36) invoked from within "test_step_over $displaced" ("uplevel" body line 2) invoked from within "uplevel 1 $body" invoked from within "with_test_prefix "displaced=$displaced" { test_step_over $displaced }" ("foreach" body line 6) invoked from within "foreach displaced { "off" "on" "auto" } { if { $displaced != "off" && ![support_displaced_stepping] } { continue } with_test_prefix "dis..." (file ".../gdb/testsuite/gdb.base/step-over-no-symbols.exp" line 84) invoked from within "source .../gdb/testsuite/gdb.base/step-over-no-symbols.exp" ("uplevel" body line 1) invoked from within "uplevel #0 source .../gdb/testsuite/gdb.base/step-over-no-symbols.exp" invoked from within "catch "uplevel #0 source $test_file_name"" Remote debugging from host xxx.xxx.xxx.xxx, port 47130 monitor exit Killing process(es): 1092 Remote communication error. Target disconnected.: Connection reset by peer. (gdb) To do so verify first, before making an arithmetic comparison, that the values to compare are actually integers (using a string comparison would result in a false PASS if both operands were empty, as in this case), making the test script proceed normally: (gdb) FAIL: gdb.base/step-over-no-symbols.exp: displaced=off: stepi p /x $pc Remote 'g' packet reply is too long (expected 264 bytes, got 532 bytes): 00000000000000002a6f61551500000080faffff3f0000000028010000000000b03857551500000060ad5f5515000000906e615515000000802401000000000090faffff3f00000000000000000000000100000000000000e8fbffff3f000000f8fbffff3f0000000000000000000000b8faffff3f0000008a05010000000000589c6f5515000000424d40435c2f7c7c1809575515000000f0e0baaa2a0000000000000000000000f0ffbaaa2a000000f0e0baaa2a0000006804baaa2a000000000000000000000000000000000000007053baaa2a0000008252b2aa2a00000090fe01000000000048e056551500000004000000000000004000000000000000920501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxxxxxx00000000 (gdb) FAIL: gdb.base/step-over-no-symbols.exp: displaced=off: get after PC FAIL: gdb.base/step-over-no-symbols.exp: displaced=off: advanced Remote debugging from host xxx.xxx.xxx.xxx, port 48404 monitor exit Killing process(es): 1795 Remote communication error. Target disconnected.: Connection reset by peer. (gdb) Note the double curly braces, to take advantage of `&&' operator's lazy evaluation. gdb/testsuite/ * gdb.base/step-over-no-symbols.exp: Verify that $before_addr and $after_addr are both integers before making a comparison.
2020-02-09[gdb/testsuite] Capture many-headers.exp progress and output in gdb.logTom de Vries2-5/+20
When running test-case gdb.base/many-headers.exp, we have test output on stdout/stderr: ... Running src/gdb/testsuite/gdb.base/many-headers.exp ... [New LWP 759] Core was generated by `outputs/gdb.base/many-headers/many'. Program terminated with signal SIGSEGV, Segmentation fault. \#0 0x0000000000400688 in ?? () === gdb Summary === nr of expected passes 1 ... Furthermore, the only trace in gdb.log that we have of the gdb command issued is: ... PASS: gdb.base/many-headers.exp: read core file ... Fix this by echoing the gdb command in gdb.log, and capturing the command output and pasting it into gdb.log: ... ( ulimit -s 4096; \ gdb -nw -nx -data-directory data-directory -batch -core=many-headers.core ) [New LWP 1542] Core was generated by `many'. Program terminated with signal SIGSEGV, Segmentation fault. \#0 0x0000000000400688 in ?? () PASS: gdb.base/many-headers.exp: read core file ... Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-02-09 Tom de Vries <tdevries@suse.de> * gdb.base/many-headers.exp: Echo gdb command to gdb.log. Capture gdb command output and paste it into gdb.log. If any, paste catch message to gdb.log.