This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] fix for PR gdb/15995
- From: Pedro Alves <palves at redhat dot com>
- To: Tom Tromey <tromey at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Tue, 08 Oct 2013 16:53:06 +0100
- Subject: Re: [PATCH] fix for PR gdb/15995
- Authentication-results: sourceware.org; auth=none
- References: <1381172232-30324-1-git-send-email-tromey at redhat dot com>
On 10/07/2013 07:57 PM, Tom Tromey wrote:
> This patch fixes PR gdb/15995.
>
> The bug here is that gdb's printf command does not flush the output
> stream. This makes a printf that is not newline-terminated interleave
> incorrectly with other forms of output, such as that generated via a
> call to an external program using "shell".
>
> I note that the "output" command already does this flushing.
>
> The fix is to call gdb_flush in printf_command.
This is fine with me.
(Though I'm wondering if there aren't more ways to get
to a shell command with no previous newline, and so it'd
make sense for the shell command itself to flush stdout
before forking the shell.)
--
Pedro Alves
>
> Built and regtested on x86-64 Fedora 18.
> New test case included.
>
> PR gdb/15995:
> * printcmd.c (printcmd): Call gdb_flush.
>
> * gdb.base/printcmds.exp (test_printf): Test printf flushing.
> ---
> gdb/printcmd.c | 1 +
> gdb/testsuite/gdb.base/printcmds.exp | 6 ++++++
> 2 files changed, 7 insertions(+)
>
> diff --git a/gdb/printcmd.c b/gdb/printcmd.c
> index 751cd2b..9bca6dd 100644
> --- a/gdb/printcmd.c
> +++ b/gdb/printcmd.c
> @@ -2458,6 +2458,7 @@ static void
> printf_command (char *arg, int from_tty)
> {
> ui_printf (arg, gdb_stdout);
> + gdb_flush (gdb_stdout);
> }
>
> /* Implement the "eval" command. */
> diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp
> index 60e4a7f..6d65107 100644
> --- a/gdb/testsuite/gdb.base/printcmds.exp
> +++ b/gdb/testsuite/gdb.base/printcmds.exp
> @@ -740,6 +740,12 @@ proc test_printf {} {
> gdb_test "printf \"% p\", 0" "Inappropriate modifiers to format specifier 'p' in printf"
> gdb_test "printf \"%0p\", 0" "Inappropriate modifiers to format specifier 'p' in printf"
> gdb_test "printf \"%+p\", 0" "Inappropriate modifiers to format specifier 'p' in printf"
> +
> +
> + gdb_test "define hibob\nprintf \"hi bob \"\nshell echo zzz\nprintf \"y\\n\"\nend" \
> + "" \
> + "create hibob command"
> + gdb_test "hibob" "hi bob zzz.*y" "run hibob command"
> }
>
> #Test printing DFP values with printf
>