* [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered
@ 2019-11-26 12:49 Iain Buclaw
2019-11-26 20:13 ` Christian Biesinger via gdb-patches
2019-11-26 20:25 ` Pedro Alves
0 siblings, 2 replies; 6+ messages in thread
From: Iain Buclaw @ 2019-11-26 12:49 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1831 bytes --]
Hi,
This patch fixes a regression, possibly introduced by 2a3c1174c3c0db1140180fb3fc56ac324d1c0a7c, in this part of the change:
---
@@ -2064,13 +2096,13 @@ vfprintf_unfiltered (struct ui_file *stream, const char *format, va_list args)
fputs_unfiltered (timestamp.c_str (), stream);
}
else
- fputs_unfiltered (linebuffer.c_str (), stream);
+ vfprintf_maybe_filtered (stream, format, args, false, true);
}
void
vprintf_filtered (const char *format, va_list args)
---
The significance of this is that printf_unfiltered writes messages to wrap_buffer, whereas puts_unfiltered pushes them immediately to stdout, resulting in "post-" messages being printed out of order.
Not sure about how to go about testing this, looking at the testsuite, such as gdb.base/annota1.exp, everything appears to be in order. Perhaps this is because the testsuite triggers one of these conditions in fputs_maybe_filtered() though.
---
if (stream != gdb_stdout
|| !pagination_enabled
|| pagination_disabled_for_command
|| batch_flag
|| (lines_per_page == UINT_MAX && chars_per_line == UINT_MAX)
|| top_level_interpreter () == NULL
|| top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ())
---
However, the actual observed behaviour in gdb is:
---
Reading symbols from a.out...
(gdb) set annotate 2
\032\032pre-prompt
(gdb)
\032\032prompt
start
prompt\032\032post-
Temporary breakpoint 1 at 0x13716: file test.c, line 3.
---
With this patch applied, instead "\032\032post-prompt" is printed.
I think this can be applied as obvious, but wanted to have someone else have a quick check, just in case it would be preferred to change fputs_maybe_filtered instead to flush the buffer on scope exit for unfiltered messages.
--
Iain
---
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: postprompt.patch --]
[-- Type: text/x-patch; name="postprompt.patch", Size: 665 bytes --]
gdb/ChangeLog:
2019-11-26 Iain Buclaw <ibuclaw@gdcproject.org>
* gdb/event-top.c (handle_line_of_input): Use puts_unfiltered instead
of printf_unfiltered.
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 0396dbcc52..df6a4095fb 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -663,9 +663,9 @@ handle_line_of_input (struct buffer *cmd_line_buffer,
if (from_tty && annotation_level > 1)
{
- printf_unfiltered (("\n\032\032post-"));
+ puts_unfiltered ("\n\032\032post-");
puts_unfiltered (annotation_suffix);
- printf_unfiltered (("\n"));
+ puts_unfiltered ("\n");
}
#define SERVER_COMMAND_PREFIX "server "
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered
2019-11-26 12:49 [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered Iain Buclaw
@ 2019-11-26 20:13 ` Christian Biesinger via gdb-patches
2019-11-26 20:25 ` Pedro Alves
1 sibling, 0 replies; 6+ messages in thread
From: Christian Biesinger via gdb-patches @ 2019-11-26 20:13 UTC (permalink / raw)
To: Iain Buclaw; +Cc: gdb-patches
Sounds like this fixes
https://sourceware.org/bugzilla/show_bug.cgi?id=25190, could you
mention that in the patch description?
(Those three lines could probably be a single printf...)
Christian
On Tue, Nov 26, 2019 at 6:49 AM Iain Buclaw <ibuclaw@gdcproject.org> wrote:
>
> Hi,
>
> This patch fixes a regression, possibly introduced by 2a3c1174c3c0db1140180fb3fc56ac324d1c0a7c, in this part of the change:
>
> ---
> @@ -2064,13 +2096,13 @@ vfprintf_unfiltered (struct ui_file *stream, const char *format, va_list args)
> fputs_unfiltered (timestamp.c_str (), stream);
> }
> else
> - fputs_unfiltered (linebuffer.c_str (), stream);
> + vfprintf_maybe_filtered (stream, format, args, false, true);
> }
>
> void
> vprintf_filtered (const char *format, va_list args)
> ---
>
> The significance of this is that printf_unfiltered writes messages to wrap_buffer, whereas puts_unfiltered pushes them immediately to stdout, resulting in "post-" messages being printed out of order.
>
> Not sure about how to go about testing this, looking at the testsuite, such as gdb.base/annota1.exp, everything appears to be in order. Perhaps this is because the testsuite triggers one of these conditions in fputs_maybe_filtered() though.
>
> ---
> if (stream != gdb_stdout
> || !pagination_enabled
> || pagination_disabled_for_command
> || batch_flag
> || (lines_per_page == UINT_MAX && chars_per_line == UINT_MAX)
> || top_level_interpreter () == NULL
> || top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ())
> ---
>
>
> However, the actual observed behaviour in gdb is:
> ---
> Reading symbols from a.out...
> (gdb) set annotate 2
>
> \032\032pre-prompt
> (gdb)
> \032\032prompt
> start
>
> prompt\032\032post-
> Temporary breakpoint 1 at 0x13716: file test.c, line 3.
> ---
>
> With this patch applied, instead "\032\032post-prompt" is printed.
>
> I think this can be applied as obvious, but wanted to have someone else have a quick check, just in case it would be preferred to change fputs_maybe_filtered instead to flush the buffer on scope exit for unfiltered messages.
>
> --
> Iain
>
> ---
>
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered
2019-11-26 12:49 [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered Iain Buclaw
2019-11-26 20:13 ` Christian Biesinger via gdb-patches
@ 2019-11-26 20:25 ` Pedro Alves
2019-11-26 23:00 ` Iain Buclaw
1 sibling, 1 reply; 6+ messages in thread
From: Pedro Alves @ 2019-11-26 20:25 UTC (permalink / raw)
To: Iain Buclaw, gdb-patches
On 11/26/19 12:49 PM, Iain Buclaw wrote:
> The significance of this is that printf_unfiltered writes messages to wrap_buffer, whereas puts_unfiltered pushes them immediately to stdout, resulting in "post-" messages being printed out of order.
It sounds quite surprising that two _unfiltered functions could behave differently
like that. That sounds like a bug that should be fixed, instead of worked around
by having to recall to use printf vs puts.
Thanks,
Pedro Alves
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered
2019-11-26 20:25 ` Pedro Alves
@ 2019-11-26 23:00 ` Iain Buclaw
2020-01-17 17:57 ` Joel Brobecker
0 siblings, 1 reply; 6+ messages in thread
From: Iain Buclaw @ 2019-11-26 23:00 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1588 bytes --]
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Tuesday, 26 November 2019 21:24, Pedro Alves <palves@redhat.com> wrote:
> On 11/26/19 12:49 PM, Iain Buclaw wrote:
>
> > The significance of this is that printf_unfiltered writes messages to wrap_buffer, whereas puts_unfiltered pushes them immediately to stdout, resulting in "post-" messages being printed out of order.
>
> It sounds quite surprising that two _unfiltered functions could behave differently
> like that. That sounds like a bug that should be fixed, instead of worked around
> by having to recall to use printf vs puts.
>
> Thanks,
> Pedro Alves
I think the best way to avoid the discrepancy is to treat both fputs_filtered and fputs_unfiltered equally by forwarding both calls to fputs_maybe_filtered.
To avoid recursion, flush_wrap_buffer and fputs_maybe_filtered have had calls to fputs_unfiltered replaced with stream->puts().
While attempting to grok my head around fputs_maybe_filtered, I also noticed that buffer_clearer is being removed by the compiler as dead code.
--
Iain
---
gdb/ChangeLog:
2019-11-26 Iain Buclaw <ibuclaw@gdcproject.org>
* gdb/ui-file.c (fputs_unfiltered): Move to utils.c.
* gdb/utils.c (flush_wrap_buffer): Call ui_file::puts instead of
fputs_unfiltered.
(fputs_maybe_filtered): Likewise. Remove unused buffer_clearer.
(fputs_unfiltered): Moved from utils.c; call fputs_maybe_filtered.
---
gdb/ui-file.c | 6 ------
gdb/utils.c | 22 +++++++++-------------
2 files changed, 9 insertions(+), 19 deletions(-)
---
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: postprompt-2.patch --]
[-- Type: text/x-patch; name="postprompt-2.patch", Size: 2245 bytes --]
diff --git a/gdb/ui-file.c b/gdb/ui-file.c
index 71b74bba19..31664d5d65 100644
--- a/gdb/ui-file.c
+++ b/gdb/ui-file.c
@@ -149,12 +149,6 @@ ui_file_read (struct ui_file *file, char *buf, long length_buf)
return file->read (buf, length_buf);
}
-void
-fputs_unfiltered (const char *buf, struct ui_file *file)
-{
- file->puts (buf);
-}
-
\f
string_file::~string_file ()
diff --git a/gdb/utils.c b/gdb/utils.c
index f7fae35729..e8cc21c8c4 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1539,7 +1539,7 @@ flush_wrap_buffer (struct ui_file *stream)
{
if (stream == gdb_stdout && !wrap_buffer.empty ())
{
- fputs_unfiltered (wrap_buffer.c_str (), stream);
+ stream->puts (wrap_buffer.c_str ());
wrap_buffer.clear ();
}
}
@@ -1688,18 +1688,10 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
|| top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ())
{
flush_wrap_buffer (stream);
- fputs_unfiltered (linebuffer, stream);
+ stream->puts (linebuffer);
return;
}
- auto buffer_clearer
- = make_scope_exit ([&] ()
- {
- wrap_buffer.clear ();
- wrap_column = 0;
- wrap_indent = "";
- });
-
/* Go through and output each character. Show line extension
when this is necessary; prompt user for new page when this is
necessary. */
@@ -1788,7 +1780,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
/* Now output indentation and wrapped string. */
if (wrap_column)
{
- fputs_unfiltered (wrap_indent, stream);
+ stream->puts (wrap_indent);
if (stream->can_emit_style_escape ())
emit_style_escape (save_style, stream);
/* FIXME, this strlen is what prevents wrap_indent from
@@ -1816,8 +1808,6 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
lineptr++;
}
}
-
- buffer_clearer.release ();
}
void
@@ -1826,6 +1816,12 @@ fputs_filtered (const char *linebuffer, struct ui_file *stream)
fputs_maybe_filtered (linebuffer, stream, 1);
}
+void
+fputs_unfiltered (const char *linebuffer, struct ui_file *stream)
+{
+ fputs_maybe_filtered (linebuffer, stream, 0);
+}
+
/* See utils.h. */
void
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered
2019-11-26 23:00 ` Iain Buclaw
@ 2020-01-17 17:57 ` Joel Brobecker
2020-01-18 18:53 ` Iain Buclaw
0 siblings, 1 reply; 6+ messages in thread
From: Joel Brobecker @ 2020-01-17 17:57 UTC (permalink / raw)
To: Iain Buclaw; +Cc: Pedro Alves, gdb-patches
Hi Iain, hi Pedro,
Is this message the latest one on this subject? Christian helped us
identify this issue as a regression, and I am wondering whether we want
to try to fix it before the 9.1 release or whether we accept it...
Thanks!
On Tue, Nov 26, 2019 at 11:00:21PM +0000, Iain Buclaw wrote:
> âââââââ Original Message âââââââ
> On Tuesday, 26 November 2019 21:24, Pedro Alves <palves@redhat.com> wrote:
>
> > On 11/26/19 12:49 PM, Iain Buclaw wrote:
> >
> > > The significance of this is that printf_unfiltered writes messages to wrap_buffer, whereas puts_unfiltered pushes them immediately to stdout, resulting in "post-" messages being printed out of order.
> >
> > It sounds quite surprising that two _unfiltered functions could behave differently
> > like that. That sounds like a bug that should be fixed, instead of worked around
> > by having to recall to use printf vs puts.
> >
> > Thanks,
> > Pedro Alves
>
> I think the best way to avoid the discrepancy is to treat both fputs_filtered and fputs_unfiltered equally by forwarding both calls to fputs_maybe_filtered.
>
> To avoid recursion, flush_wrap_buffer and fputs_maybe_filtered have had calls to fputs_unfiltered replaced with stream->puts().
>
> While attempting to grok my head around fputs_maybe_filtered, I also noticed that buffer_clearer is being removed by the compiler as dead code.
>
> --
> Iain
>
> ---
> gdb/ChangeLog:
>
> 2019-11-26 Iain Buclaw <ibuclaw@gdcproject.org>
>
> * gdb/ui-file.c (fputs_unfiltered): Move to utils.c.
> * gdb/utils.c (flush_wrap_buffer): Call ui_file::puts instead of
> fputs_unfiltered.
> (fputs_maybe_filtered): Likewise. Remove unused buffer_clearer.
> (fputs_unfiltered): Moved from utils.c; call fputs_maybe_filtered.
>
> ---
> gdb/ui-file.c | 6 ------
> gdb/utils.c | 22 +++++++++-------------
> 2 files changed, 9 insertions(+), 19 deletions(-)
>
> ---
>
>
> diff --git a/gdb/ui-file.c b/gdb/ui-file.c
> index 71b74bba19..31664d5d65 100644
> --- a/gdb/ui-file.c
> +++ b/gdb/ui-file.c
> @@ -149,12 +149,6 @@ ui_file_read (struct ui_file *file, char *buf, long length_buf)
> return file->read (buf, length_buf);
> }
>
> -void
> -fputs_unfiltered (const char *buf, struct ui_file *file)
> -{
> - file->puts (buf);
> -}
> -
> \f
>
> string_file::~string_file ()
> diff --git a/gdb/utils.c b/gdb/utils.c
> index f7fae35729..e8cc21c8c4 100644
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -1539,7 +1539,7 @@ flush_wrap_buffer (struct ui_file *stream)
> {
> if (stream == gdb_stdout && !wrap_buffer.empty ())
> {
> - fputs_unfiltered (wrap_buffer.c_str (), stream);
> + stream->puts (wrap_buffer.c_str ());
> wrap_buffer.clear ();
> }
> }
> @@ -1688,18 +1688,10 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
> || top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ())
> {
> flush_wrap_buffer (stream);
> - fputs_unfiltered (linebuffer, stream);
> + stream->puts (linebuffer);
> return;
> }
>
> - auto buffer_clearer
> - = make_scope_exit ([&] ()
> - {
> - wrap_buffer.clear ();
> - wrap_column = 0;
> - wrap_indent = "";
> - });
> -
> /* Go through and output each character. Show line extension
> when this is necessary; prompt user for new page when this is
> necessary. */
> @@ -1788,7 +1780,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
> /* Now output indentation and wrapped string. */
> if (wrap_column)
> {
> - fputs_unfiltered (wrap_indent, stream);
> + stream->puts (wrap_indent);
> if (stream->can_emit_style_escape ())
> emit_style_escape (save_style, stream);
> /* FIXME, this strlen is what prevents wrap_indent from
> @@ -1816,8 +1808,6 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
> lineptr++;
> }
> }
> -
> - buffer_clearer.release ();
> }
>
> void
> @@ -1826,6 +1816,12 @@ fputs_filtered (const char *linebuffer, struct ui_file *stream)
> fputs_maybe_filtered (linebuffer, stream, 1);
> }
>
> +void
> +fputs_unfiltered (const char *linebuffer, struct ui_file *stream)
> +{
> + fputs_maybe_filtered (linebuffer, stream, 0);
> +}
> +
> /* See utils.h. */
>
> void
--
Joel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered
2020-01-17 17:57 ` Joel Brobecker
@ 2020-01-18 18:53 ` Iain Buclaw
0 siblings, 0 replies; 6+ messages in thread
From: Iain Buclaw @ 2020-01-18 18:53 UTC (permalink / raw)
To: Joel Brobecker; +Cc: Pedro Alves, gdb-patches
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Friday, January 17, 2020 6:56 PM, Joel Brobecker <brobecker@adacore.com> wrote:
> Hi Iain, hi Pedro,
>
> Is this message the latest one on this subject? Christian helped us
> identify this issue as a regression, and I am wondering whether we want
> to try to fix it before the 9.1 release or whether we accept it...
>
> Thanks!
>
Hi,
As I've already said, there was a follow-up that instead attempted to fix the filtered vs unfiltered inconsistencies that caused the bug.
So rather than this one, I'd suggest looking at the other two here.
https://sourceware.org/ml/gdb-patches/2019-11/msg01120.html
https://sourceware.org/ml/gdb-patches/2019-11/msg01121.html
Regards
Iain.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-01-18 14:46 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-26 12:49 [PATCH] gdb: Use puts_unfiltered instead of printf_unfiltered Iain Buclaw
2019-11-26 20:13 ` Christian Biesinger via gdb-patches
2019-11-26 20:25 ` Pedro Alves
2019-11-26 23:00 ` Iain Buclaw
2020-01-17 17:57 ` Joel Brobecker
2020-01-18 18:53 ` Iain Buclaw
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox