Backport upstream fix and test case for a dprintf bug (RHBZ 2022177)
This commit is contained in:
parent
1c15f132e5
commit
8fedf35634
@ -328,3 +328,9 @@ Patch078: gdb-rhbz2012976-paper-over-fortran-lex-problems.patch
|
||||
# Backport manpage update
|
||||
Patch079: gdb-rhbz-853071-update-manpages.patch
|
||||
|
||||
# Backport fix for dprintf bug (RH BZ 2022177).
|
||||
Patch080: gdb-rhbz2022177-dprintf-1.patch
|
||||
|
||||
# Backport test case for dprintf bug (RH BZ 2022177).
|
||||
Patch081: gdb-rhbz2022177-dprintf-2.patch
|
||||
|
||||
|
@ -77,3 +77,5 @@
|
||||
%patch077 -p1
|
||||
%patch078 -p1
|
||||
%patch079 -p1
|
||||
%patch080 -p1
|
||||
%patch081 -p1
|
||||
|
@ -77,3 +77,5 @@ gdb-rhbz1976887-field-location-kind.patch
|
||||
gdb-test-for-rhbz1976887.patch
|
||||
gdb-rhbz2012976-paper-over-fortran-lex-problems.patch
|
||||
gdb-rhbz-853071-update-manpages.patch
|
||||
gdb-rhbz2022177-dprintf-1.patch
|
||||
gdb-rhbz2022177-dprintf-2.patch
|
||||
|
315
gdb-rhbz2022177-dprintf-1.patch
Normal file
315
gdb-rhbz2022177-dprintf-1.patch
Normal file
@ -0,0 +1,315 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Buettner <kevinb@redhat.com>
|
||||
Date: Wed, 10 Nov 2021 18:52:22 -0700
|
||||
Subject: gdb-rhbz2022177-dprintf-1.patch
|
||||
|
||||
;; Backport fix for dprintf bug (RH BZ 2022177).
|
||||
|
||||
Fix PR 28308 - dprintf breakpoints not working when run from script
|
||||
|
||||
This commit fixes Bug 28308, titled "Strange interactions with
|
||||
dprintf and break/commands":
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28308
|
||||
|
||||
Since creating that bug report, I've found a somewhat simpler way of
|
||||
reproducing the problem. I've encapsulated it into the GDB test case
|
||||
which I've created along with this bug fix. The name of the new test
|
||||
is gdb.base/dprintf-execution-x-script.exp, I'll demonstrate the
|
||||
problem using this test case, though for brevity, I've placed all
|
||||
relevant files in the same directory and have renamed the files to all
|
||||
start with 'dp-bug' instead of 'dprintf-execution-x-script'.
|
||||
|
||||
The script file, named dp-bug.gdb, consists of the following commands:
|
||||
|
||||
dprintf increment, "dprintf in increment(), vi=%d\n", vi
|
||||
break inc_vi
|
||||
commands
|
||||
continue
|
||||
end
|
||||
run
|
||||
|
||||
Note that the final command in this script is 'run'. When 'run' is
|
||||
instead issued interactively, the bug does not occur. So, let's look
|
||||
at the interactive case first in order to see the correct/expected
|
||||
output:
|
||||
|
||||
$ gdb -q -x dp-bug.gdb dp-bug
|
||||
... eliding buggy output which I'll discuss later ...
|
||||
(gdb) run
|
||||
Starting program: /mesquite2/sourceware-git/f34-master/bld/gdb/tmp/dp-bug
|
||||
vi=0
|
||||
dprintf in increment(), vi=0
|
||||
|
||||
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
|
||||
26 in dprintf-execution-x-script.c
|
||||
vi=1
|
||||
dprintf in increment(), vi=1
|
||||
|
||||
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
|
||||
26 in dprintf-execution-x-script.c
|
||||
vi=2
|
||||
dprintf in increment(), vi=2
|
||||
|
||||
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
|
||||
26 in dprintf-execution-x-script.c
|
||||
vi=3
|
||||
[Inferior 1 (process 1539210) exited normally]
|
||||
|
||||
In this run, in which 'run' was issued from the gdb prompt (instead
|
||||
of at the end of the script), there are three dprintf messages along
|
||||
with three 'Breakpoint 2' messages. This is the correct output.
|
||||
|
||||
Now let's look at the output that I snipped above; this is the output
|
||||
when 'run' is issued from the script loaded via GDB's -x switch:
|
||||
|
||||
$ gdb -q -x dp-bug.gdb dp-bug
|
||||
Reading symbols from dp-bug...
|
||||
Dprintf 1 at 0x40116e: file dprintf-execution-x-script.c, line 38.
|
||||
Breakpoint 2 at 0x40113a: file dprintf-execution-x-script.c, line 26.
|
||||
vi=0
|
||||
dprintf in increment(), vi=0
|
||||
|
||||
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
|
||||
26 dprintf-execution-x-script.c: No such file or directory.
|
||||
vi=1
|
||||
|
||||
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
|
||||
26 in dprintf-execution-x-script.c
|
||||
vi=2
|
||||
|
||||
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
|
||||
26 in dprintf-execution-x-script.c
|
||||
vi=3
|
||||
[Inferior 1 (process 1539175) exited normally]
|
||||
|
||||
In the output shown above, only the first dprintf message is printed.
|
||||
The 2nd and 3rd dprintf messages are missing! However, all three
|
||||
'Breakpoint 2...' messages are still printed.
|
||||
|
||||
Why does this happen?
|
||||
|
||||
bpstat_do_actions_1() in gdb/breakpoint.c contains the following
|
||||
comment and code near the start of the function:
|
||||
|
||||
/* Avoid endless recursion if a `source' command is contained
|
||||
in bs->commands. */
|
||||
if (executing_breakpoint_commands)
|
||||
return 0;
|
||||
|
||||
scoped_restore save_executing
|
||||
= make_scoped_restore (&executing_breakpoint_commands, 1);
|
||||
|
||||
Also, as described by this comment prior to the 'async' field
|
||||
in 'struct ui' in top.h, the main UI starts off in sync mode
|
||||
when processing command line arguments:
|
||||
|
||||
/* True if the UI is in async mode, false if in sync mode. If in
|
||||
sync mode, a synchronous execution command (e.g, "next") does not
|
||||
return until the command is finished. If in async mode, then
|
||||
running a synchronous command returns right after resuming the
|
||||
target. Waiting for the command's completion is later done on
|
||||
the top event loop. For the main UI, this starts out disabled,
|
||||
until all the explicit command line arguments (e.g., `gdb -ex
|
||||
"start" -ex "next"') are processed. */
|
||||
|
||||
This combination of things, the state of the static global
|
||||
'executing_breakpoint_commands' plus the state of the async
|
||||
field in the main UI causes this behavior.
|
||||
|
||||
This is a backtrace after hitting the dprintf breakpoint for
|
||||
the second time when doing 'run' from the script file, i.e.
|
||||
non-interactively:
|
||||
|
||||
Thread 1 "gdb" hit Breakpoint 3, bpstat_do_actions_1 (bsp=0x7fffffffc2b8)
|
||||
at /ironwood1/sourceware-git/f34-master/bld/../../worktree-master/gdb/breakpoint.c:4431
|
||||
4431 if (executing_breakpoint_commands)
|
||||
|
||||
#0 bpstat_do_actions_1 (bsp=0x7fffffffc2b8)
|
||||
at gdb/breakpoint.c:4431
|
||||
#1 0x00000000004d8bc6 in dprintf_after_condition_true (bs=0x1538090)
|
||||
at gdb/breakpoint.c:13048
|
||||
#2 0x00000000004c5caa in bpstat_stop_status (aspace=0x116dbc0, bp_addr=0x40116e, thread=0x137f450, ws=0x7fffffffc718,
|
||||
stop_chain=0x1538090) at gdb/breakpoint.c:5498
|
||||
#3 0x0000000000768d98 in handle_signal_stop (ecs=0x7fffffffc6f0)
|
||||
at gdb/infrun.c:6172
|
||||
#4 0x00000000007678d3 in handle_inferior_event (ecs=0x7fffffffc6f0)
|
||||
at gdb/infrun.c:5662
|
||||
#5 0x0000000000763cd5 in fetch_inferior_event ()
|
||||
at gdb/infrun.c:4060
|
||||
#6 0x0000000000746d7d in inferior_event_handler (event_type=INF_REG_EVENT)
|
||||
at gdb/inf-loop.c:41
|
||||
#7 0x00000000007a702f in handle_target_event (error=0, client_data=0x0)
|
||||
at gdb/linux-nat.c:4207
|
||||
#8 0x0000000000b8cd6e in gdb_wait_for_event (block=block@entry=0)
|
||||
at gdbsupport/event-loop.cc:701
|
||||
#9 0x0000000000b8d032 in gdb_wait_for_event (block=0)
|
||||
at gdbsupport/event-loop.cc:597
|
||||
#10 gdb_do_one_event () at gdbsupport/event-loop.cc:212
|
||||
#11 0x00000000009d19b6 in wait_sync_command_done ()
|
||||
at gdb/top.c:528
|
||||
#12 0x00000000009d1a3f in maybe_wait_sync_command_done (was_sync=0)
|
||||
at gdb/top.c:545
|
||||
#13 0x00000000009d2033 in execute_command (p=0x7fffffffcb18 "", from_tty=0)
|
||||
at gdb/top.c:676
|
||||
#14 0x0000000000560d5b in execute_control_command_1 (cmd=0x13b9bb0, from_tty=0)
|
||||
at gdb/cli/cli-script.c:547
|
||||
#15 0x000000000056134a in execute_control_command (cmd=0x13b9bb0, from_tty=0)
|
||||
at gdb/cli/cli-script.c:717
|
||||
#16 0x00000000004c3bbe in bpstat_do_actions_1 (bsp=0x137f530)
|
||||
at gdb/breakpoint.c:4469
|
||||
#17 0x00000000004c3d40 in bpstat_do_actions ()
|
||||
at gdb/breakpoint.c:4533
|
||||
#18 0x00000000006a473a in command_handler (command=0x1399ad0 "run")
|
||||
at gdb/event-top.c:624
|
||||
#19 0x00000000009d182e in read_command_file (stream=0x113e540)
|
||||
at gdb/top.c:443
|
||||
#20 0x0000000000563697 in script_from_file (stream=0x113e540, file=0x13bb0b0 "dp-bug.gdb")
|
||||
at gdb/cli/cli-script.c:1642
|
||||
#21 0x00000000006abd63 in source_gdb_script (extlang=0xc44e80 <extension_language_gdb>, stream=0x113e540,
|
||||
file=0x13bb0b0 "dp-bug.gdb") at gdb/extension.c:188
|
||||
#22 0x0000000000544400 in source_script_from_stream (stream=0x113e540, file=0x7fffffffd91a "dp-bug.gdb",
|
||||
file_to_open=0x13bb0b0 "dp-bug.gdb")
|
||||
at gdb/cli/cli-cmds.c:692
|
||||
#23 0x0000000000544557 in source_script_with_search (file=0x7fffffffd91a "dp-bug.gdb", from_tty=1, search_path=0)
|
||||
at gdb/cli/cli-cmds.c:750
|
||||
#24 0x00000000005445cf in source_script (file=0x7fffffffd91a "dp-bug.gdb", from_tty=1)
|
||||
at gdb/cli/cli-cmds.c:759
|
||||
#25 0x00000000007cf6d9 in catch_command_errors (command=0x5445aa <source_script(char const*, int)>,
|
||||
arg=0x7fffffffd91a "dp-bug.gdb", from_tty=1, do_bp_actions=false)
|
||||
at gdb/main.c:523
|
||||
#26 0x00000000007cf85d in execute_cmdargs (cmdarg_vec=0x7fffffffd1b0, file_type=CMDARG_FILE, cmd_type=CMDARG_COMMAND,
|
||||
ret=0x7fffffffd18c) at gdb/main.c:615
|
||||
#27 0x00000000007d0c8e in captured_main_1 (context=0x7fffffffd3f0)
|
||||
at gdb/main.c:1322
|
||||
#28 0x00000000007d0eba in captured_main (data=0x7fffffffd3f0)
|
||||
at gdb/main.c:1343
|
||||
#29 0x00000000007d0f25 in gdb_main (args=0x7fffffffd3f0)
|
||||
at gdb/main.c:1368
|
||||
#30 0x00000000004186dd in main (argc=5, argv=0x7fffffffd508)
|
||||
at gdb/gdb.c:32
|
||||
|
||||
There are two frames for bpstat_do_actions_1(), one at frame #16 and
|
||||
the other at frame #0. The one at frame #16 is processing the actions
|
||||
for Breakpoint 2, which is a 'continue'. The one at frame #0 is attempting
|
||||
to process the dprintf breakpoint action. However, at this point,
|
||||
the value of 'executing_breakpoint_commands' is 1, forcing an early
|
||||
return, i.e. prior to executing the command(s) associated with the dprintf
|
||||
breakpoint.
|
||||
|
||||
For the sake of comparison, this is what the stack looks like when hitting
|
||||
the dprintf breakpoint for the second time when issuing the 'run'
|
||||
command from the GDB prompt.
|
||||
|
||||
Thread 1 "gdb" hit Breakpoint 3, bpstat_do_actions_1 (bsp=0x7fffffffccd8)
|
||||
at /ironwood1/sourceware-git/f34-master/bld/../../worktree-master/gdb/breakpoint.c:4431
|
||||
4431 if (executing_breakpoint_commands)
|
||||
|
||||
#0 bpstat_do_actions_1 (bsp=0x7fffffffccd8)
|
||||
at gdb/breakpoint.c:4431
|
||||
#1 0x00000000004d8bc6 in dprintf_after_condition_true (bs=0x16b0290)
|
||||
at gdb/breakpoint.c:13048
|
||||
#2 0x00000000004c5caa in bpstat_stop_status (aspace=0x116dbc0, bp_addr=0x40116e, thread=0x13f0e60, ws=0x7fffffffd138,
|
||||
stop_chain=0x16b0290) at gdb/breakpoint.c:5498
|
||||
#3 0x0000000000768d98 in handle_signal_stop (ecs=0x7fffffffd110)
|
||||
at gdb/infrun.c:6172
|
||||
#4 0x00000000007678d3 in handle_inferior_event (ecs=0x7fffffffd110)
|
||||
at gdb/infrun.c:5662
|
||||
#5 0x0000000000763cd5 in fetch_inferior_event ()
|
||||
at gdb/infrun.c:4060
|
||||
#6 0x0000000000746d7d in inferior_event_handler (event_type=INF_REG_EVENT)
|
||||
at gdb/inf-loop.c:41
|
||||
#7 0x00000000007a702f in handle_target_event (error=0, client_data=0x0)
|
||||
at gdb/linux-nat.c:4207
|
||||
#8 0x0000000000b8cd6e in gdb_wait_for_event (block=block@entry=0)
|
||||
at gdbsupport/event-loop.cc:701
|
||||
#9 0x0000000000b8d032 in gdb_wait_for_event (block=0)
|
||||
at gdbsupport/event-loop.cc:597
|
||||
#10 gdb_do_one_event () at gdbsupport/event-loop.cc:212
|
||||
#11 0x00000000007cf512 in start_event_loop ()
|
||||
at gdb/main.c:421
|
||||
#12 0x00000000007cf631 in captured_command_loop ()
|
||||
at gdb/main.c:481
|
||||
#13 0x00000000007d0ebf in captured_main (data=0x7fffffffd3f0)
|
||||
at gdb/main.c:1353
|
||||
#14 0x00000000007d0f25 in gdb_main (args=0x7fffffffd3f0)
|
||||
at gdb/main.c:1368
|
||||
#15 0x00000000004186dd in main (argc=5, argv=0x7fffffffd508)
|
||||
at gdb/gdb.c:32
|
||||
|
||||
This relatively short backtrace is due to the current UI's async field
|
||||
being set to 1.
|
||||
|
||||
Yet another thing to be aware of regarding this problem is the
|
||||
difference in the way that commands associated to dprintf breakpoints
|
||||
versus regular breakpoints are handled. While they both use a command
|
||||
list associated with the breakpoint, regular breakpoints will place
|
||||
the commands to be run on the bpstat chain constructed in
|
||||
bp_stop_status(). These commands are run later on. For dprintf
|
||||
breakpoints, commands are run via the 'after_condition_true' function
|
||||
pointer directly from bpstat_stop_status(). (The 'commands' field in
|
||||
the bpstat is cleared in dprintf_after_condition_true(). This
|
||||
prevents the dprintf commands from being run again later on when other
|
||||
commands on the bpstat chain are processed.)
|
||||
|
||||
Another thing that I noticed is that dprintf breakpoints are the only
|
||||
type of breakpoint which use 'after_condition_true'. This suggests
|
||||
that one possible way of fixing this problem, that of making dprintf
|
||||
breakpoints work more like regular breakpoints, probably won't work.
|
||||
(I must admit, however, that my understanding of this code isn't
|
||||
complete enough to say why. I'll trust that whoever implemented it
|
||||
had a good reason for doing it this way.)
|
||||
|
||||
The comment referenced earlier regarding 'executing_breakpoint_commands'
|
||||
states that the reason for checking this variable is to avoid
|
||||
potential endless recursion when a 'source' command appears in
|
||||
bs->commands. We know that a dprintf command is constrained to either
|
||||
1) execution of a GDB printf command, 2) an inferior function call of
|
||||
a printf-like function, or 3) execution of an agent-printf command.
|
||||
Therefore, infinite recursion due to a 'source' command cannot happen
|
||||
when executing commands upon hitting a dprintf breakpoint.
|
||||
|
||||
I chose to fix this problem by having dprintf_after_condition_true()
|
||||
directly call execute_control_commands(). This means that it no
|
||||
longer attempts to go through bpstat_do_actions_1() avoiding the
|
||||
infinite recursion check for potential 'source' commands on the
|
||||
command chain. I think it simplifies this code a little bit too, a
|
||||
definite bonus.
|
||||
|
||||
Summary:
|
||||
|
||||
* breakpoint.c (dprintf_after_condition_true): Don't call
|
||||
bpstat_do_actions_1(). Call execute_control_commands()
|
||||
instead.
|
||||
|
||||
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
|
||||
--- a/gdb/breakpoint.c
|
||||
+++ b/gdb/breakpoint.c
|
||||
@@ -13043,9 +13043,6 @@ dprintf_print_recreate (struct breakpoint *tp, struct ui_file *fp)
|
||||
static void
|
||||
dprintf_after_condition_true (struct bpstats *bs)
|
||||
{
|
||||
- struct bpstats tmp_bs;
|
||||
- struct bpstats *tmp_bs_p = &tmp_bs;
|
||||
-
|
||||
/* dprintf's never cause a stop. This wasn't set in the
|
||||
check_status hook instead because that would make the dprintf's
|
||||
condition not be evaluated. */
|
||||
@@ -13056,14 +13053,9 @@ dprintf_after_condition_true (struct bpstats *bs)
|
||||
bpstat_do_actions, if a breakpoint that causes a stop happens to
|
||||
be set at same address as this dprintf, or even if running the
|
||||
commands here throws. */
|
||||
- tmp_bs.commands = bs->commands;
|
||||
- bs->commands = NULL;
|
||||
-
|
||||
- bpstat_do_actions_1 (&tmp_bs_p);
|
||||
-
|
||||
- /* 'tmp_bs.commands' will usually be NULL by now, but
|
||||
- bpstat_do_actions_1 may return early without processing the whole
|
||||
- list. */
|
||||
+ counted_command_line cmds = std::move (bs->commands);
|
||||
+ gdb_assert (cmds != nullptr);
|
||||
+ execute_control_commands (cmds.get (), 0);
|
||||
}
|
||||
|
||||
/* The breakpoint_ops structure to be used on static tracepoints with
|
194
gdb-rhbz2022177-dprintf-2.patch
Normal file
194
gdb-rhbz2022177-dprintf-2.patch
Normal file
@ -0,0 +1,194 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Buettner <kevinb@redhat.com>
|
||||
Date: Wed, 10 Nov 2021 18:55:43 -0700
|
||||
Subject: gdb-rhbz2022177-dprintf-2.patch
|
||||
|
||||
;; Backport test case for dprintf bug (RH BZ 2022177).
|
||||
|
||||
Test case for Bug 28308
|
||||
|
||||
The purpose of this test is described in the comments in
|
||||
dprintf-execution-x-script.exp.
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28308
|
||||
|
||||
The name of this new test was based on that of an existing test,
|
||||
bp-cmds-execution-x-script.exp. I started off by copying that test,
|
||||
adding to it, and then rewriting almost all of it. It's different
|
||||
enough that I decided that listing the copyright year as 2021
|
||||
was sufficient.
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.c b/gdb/testsuite/gdb.base/dprintf-execution-x-script.c
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.c
|
||||
@@ -0,0 +1,53 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2021 Free Software Foundation, Inc.
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify
|
||||
+ it under the terms of the GNU General Public License as published by
|
||||
+ the Free Software Foundation; either version 3 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <stdlib.h>
|
||||
+#include <stdio.h>
|
||||
+
|
||||
+volatile int vi = 0;
|
||||
+
|
||||
+void
|
||||
+inc_vi ()
|
||||
+{
|
||||
+ vi++;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+print_vi ()
|
||||
+{
|
||||
+ printf ("vi=%d\n", vi);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+increment ()
|
||||
+{
|
||||
+ inc_vi ();
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (int argc, char **argv)
|
||||
+{
|
||||
+ print_vi ();
|
||||
+ increment ();
|
||||
+ print_vi ();
|
||||
+ increment ();
|
||||
+ print_vi ();
|
||||
+ increment ();
|
||||
+ print_vi ();
|
||||
+
|
||||
+ exit (0);
|
||||
+}
|
||||
diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp b/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp
|
||||
@@ -0,0 +1,85 @@
|
||||
+# Copyright 2021 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+# Test that commands in a GDB script file run via GDB's -x flag work
|
||||
+# as expected. Specifically, the script creates a dprintf breakpoint
|
||||
+# as well as a normal breakpoint that has "continue" in its command
|
||||
+# list, and then does "run". Correct output from GDB is checked as
|
||||
+# part of this test.
|
||||
+
|
||||
+# Bail out if the target can't use the 'run' command.
|
||||
+if ![target_can_use_run_cmd] {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+standard_testfile
|
||||
+
|
||||
+if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+# This is the name of the GDB script to load.
|
||||
+set x_file ${srcdir}/${subdir}/$testfile.gdb
|
||||
+
|
||||
+# Create context in which the global, GDBFLAGS, will be restored at
|
||||
+# the end of the block. All commands run within the block are
|
||||
+# actually run in the outer context. (This is why 'res' is available
|
||||
+# outside of the save_vars block.)
|
||||
+save_vars { GDBFLAGS } {
|
||||
+ # Set flags with which to start GDB.
|
||||
+ append GDBFLAGS " -ex \"set height unlimited\""
|
||||
+ append GDBFLAGS " -x \"$x_file\""
|
||||
+ append GDBFLAGS " --args \"$binfile\""
|
||||
+
|
||||
+ # Start GDB with above flags.
|
||||
+ set res [gdb_spawn]
|
||||
+}
|
||||
+
|
||||
+set test "load and run script with -x"
|
||||
+if { $res != 0} {
|
||||
+ fail $test
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+# The script loaded via -x contains a run command; while running, GDB
|
||||
+# is expected to print three messages from dprintf breakpoints along
|
||||
+# with three interspersed messages from an ordinary breakpoint (which
|
||||
+# was set up with a continue command). Set up pattern D to match
|
||||
+# output from hitting the dprintf breakpoint and B for the ordinary
|
||||
+# breakpoint. Then set PAT to contain the entire pattern of expected
|
||||
+# output from the interspersed dprintf and ordinary breakpoints along
|
||||
+# with some (additional) expected output from the dprintf breakpoints,
|
||||
+# i.e. 0, 1, and 2.
|
||||
+set d "dprintf in increment.., vi="
|
||||
+set b "Breakpoint ., inc_vi"
|
||||
+set pat "${d}0.*?$b.*?${d}1.*?$b.*?${d}2.*?$b.*?"
|
||||
+
|
||||
+proc do_test {cmd test} {
|
||||
+ gdb_test $cmd "$::pat$::inferior_exited_re normally.*" $test
|
||||
+}
|
||||
+
|
||||
+# Check output from running script with -x
|
||||
+do_test "" $test
|
||||
+
|
||||
+# Restart GDB and 'source' the script; this will (still) run the program
|
||||
+# due to the 'run' command in the script.
|
||||
+clean_restart $binfile
|
||||
+do_test "source $x_file" "load and run script using source command"
|
||||
+
|
||||
+# This should leave us at the gdb prompt; Run program again using
|
||||
+# already established breakpoints, i.e. those loaded from the
|
||||
+# script. Prior to fixing PR 28308, this was the only test that
|
||||
+# would pass.
|
||||
+do_test "run" "run again"
|
||||
diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb b/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb
|
||||
@@ -0,0 +1,21 @@
|
||||
+# Copyright 2021 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+dprintf increment, "dprintf in increment(), vi=%d\n", vi
|
||||
+break inc_vi
|
||||
+commands
|
||||
+ continue
|
||||
+end
|
||||
+run
|
6
gdb.spec
6
gdb.spec
@ -37,7 +37,7 @@ Version: 11.1
|
||||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||
Release: 4%{?dist}
|
||||
Release: 5%{?dist}
|
||||
|
||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
|
||||
# Do not provide URL for snapshots as the file lasts there only for 2 days.
|
||||
@ -1143,6 +1143,10 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Wed Nov 10 2021 Kevin Buettner - 11.1-5
|
||||
- Backport upstream fix and test case for a dprintf bug (RHBZ 2022177, Kevin
|
||||
Buettner).
|
||||
|
||||
* Tue Nov 9 2021 Bruno Larsen - 11.1-4
|
||||
- Backport manpage update to be closer to -help (RHBZ 853071)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user