GDB ui word wrapping broken/interferes with 'set style' ?

Message ID 877efqlgu6.fsf@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey Dec. 30, 2018, 11:45 p.m. UTC
  Tom> Seems very likely.  Thanks for the report, I will look into it.

Please try this.  I think it fixes both of the styling problems you
reported, but it's better if you check it too.  If it works for you I
will write a test case.

thanks,
Tom
  

Comments

Philippe Waroquiers Dec. 31, 2018, 8:13 a.m. UTC | #1
On Sun, 2018-12-30 at 16:45 -0700, Tom Tromey wrote:
> Tom> Seems very likely.  Thanks for the report, I will look into it.
> 
> Please try this.  I think it fixes both of the styling problems you
> reported, but it's better if you check it too.  If it works for you I
> will write a test case.
Function and address colors are now as expected in the backtrace.

For word wrapping, I could not make it split addresses anymore,
but I still see differences with the 8.2 behaviour,
where the new gdb git+patch still splits filenames or some values.

8.2:
 (gdb) bt
#0  proc_in_c () at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
(gdb) 

git+patch:
(gdb) bt
#0  proc_in_c () at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada () at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lan
   g/proc_in_ada.adb:22
(gdb) 

(in both cases, 'show width' shows 116).

In a top-gdb debugging itself, I e.g. got the 'style' value which is split after FUNCTIO:
Breakpoint 3, cli_ui_out::do_field_string (this=0x562a4563f010, fldno=<optimized out>, width=<optimized out>, align=
    ui_noalign, fldname=<optimized out>, string=0x7ffd643d1ac8 "proc_in_ada", style=ui_out_style_kind::FUNCTIO
    N) at ../../smallthing/gdb/cli-out.c:174
174		  fstyle = function_name_style.style ();
(top-gdb) show width
Number of characters gdb thinks are in a line is 116.


If I change the width, the new gdb gives:
(gdb) set width 40
(gdb) bt
#0  proc_in_c () at /bd/home/philippe/gd
   b/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada ()
    at /bd/home/philippe/gdb/git/smal
   lthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
(gdb)
 
while 8.2 gives:
(gdb) set width 40
(gdb) bt
#0  proc_in_c ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada
    ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
(gdb) 


Playing further with smaller width, git+patch:
<et width 15     
(gdb) bt
#0  proc_in_c (
   ) at /bd/h
   ome/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada () at /
   bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
<idth 14
(gdb) bt
#0  proc_in_c 
   () at /bd/
   home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada () a
   t /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
<idth 13
(gdb) bt
#0  proc_in_c () at /bd/ho
   me/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada (
   ) at /bd
   /home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
(gdb) 

8.2:
(gdb) set width 15
(gdb) bt
#0  proc_in_c
    ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
<idth 14    
(gdb) bt
#0  proc_in_c
    ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
< width 13 
(gdb) bt
#0  proc_in_c ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/some_c.c:26
#1  0x0000555555555477 in proc_in_ada
    ()
    at /bd/home/philippe/gdb/git/smallthing/gdb/testsuite/gdb.ada/info_auto_lang/proc_in_ada.adb:22
(gdb) 


Note that the behaviour of 8.2 is not always consistent for all commands.
E.g. info breaks in top-gdb gives:
(top-gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000562a43bbbdd0 in internal_error(char const*, int, char const*, ...) 
                                                   at ../../smallthing/gdb/common/errors.c:51
2       breakpoint     keep y   0x0000562a43ba3510 in info_command(char const*, int) 
                                                   at ../../smallthing/gdb/cli/cli-cmds.c:199
        silent
        return
3       breakpoint     keep y   0x0000562a43ba2610 in cli_ui_out::do_field_string(int, int, ui_align, char const*, char const*, ui_out_style_kind) at ../../smallthing/gdb/cli-out.c:174
	breakpoint already hit 2 times
(top-gdb) 

So, it splits before the ' at' in the first 2, but uses one single line
for the 3rd breakpoint.

gdb+patch gives:
(top-gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000562a43bbbdd0 in internal_error(char const*, int, char const*, ...) at ../../sm
                                                   allthing/gdb/common/errors.c:51
2       breakpoint     keep y   0x0000562a43ba3510 in info_command(char const*, int) at ../../smallthing/gdb/cli/cli
                                                   -cmds.c:199
        silent
        return
3       breakpoint     keep y   0x0000562a43ba2610 in cli_ui_out::do_field_string(int, int, ui_align, char const*, char const*, ui_out_style_kind) at ../../smallthing/gdb/cli-out.c:174
	breakpoint already hit 4 times
(top-gdb) detach

So, splits in the middle of filenames for the first 2 breakpoints,
and does not split for the 3rd.


> 
> thanks,
> Tom
> 
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index 7be4360e62..0d1fcb79f1 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,3 +1,7 @@
> +2018-12-30  Tom Tromey  <tom@tromey.com>
> +
> +	* utils.c (flush_wrap_buffer): Only flush gdb_stdout.
> +
>  2018-12-30  Tom Tromey  <tom@tromey.com>
>  
>  	* event-top.h (command_line_handler): Update.
> diff --git a/gdb/utils.c b/gdb/utils.c
> index 3a6f796f2b..753eb14280 100644
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -1589,7 +1589,7 @@ reinitialize_more_filter (void)
>  static void
>  flush_wrap_buffer (struct ui_file *stream)
>  {
> -  if (!wrap_buffer.empty ())
> +  if (stream == gdb_stdout && !wrap_buffer.empty ())
>      {
>        fputs_unfiltered (wrap_buffer.c_str (), stream);
>        wrap_buffer.clear ();
  
Tom Tromey Jan. 6, 2019, 11:40 p.m. UTC | #2
>>>>> "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:

Philippe> For word wrapping, I could not make it split addresses anymore,
Philippe> but I still see differences with the 8.2 behaviour,
Philippe> where the new gdb git+patch still splits filenames or some values.
[...]

Ok, I think I finally found this.  I have a patch that works for me.
I still have to write a test case.

I looked into writing a unit test, but that is pretty complicated given
the many conditions at the top of fputs_maybe_filtered.  I suppose I'd
have to install a new top level interpreter to make it possible, among
other things.  (It seems to me that maybe this should check some
property of the ui_file and not the interpreter, but that's a much
larger patch...)

Tom
  
Philippe Waroquiers Jan. 7, 2019, 1:45 p.m. UTC | #3
On Sun, 2019-01-06 at 16:40 -0700, Tom Tromey wrote:
> > > > > > "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:
> 
> Philippe> For word wrapping, I could not make it split addresses anymore,
> Philippe> but I still see differences with the 8.2 behaviour,
> Philippe> where the new gdb git+patch still splits filenames or some values.
> [...]
> 
> Ok, I think I finally found this.  I have a patch that works for me.
> I still have to write a test case.
> 
> I looked into writing a unit test, but that is pretty complicated given
> the many conditions at the top of fputs_maybe_filtered.  I suppose I'd
> have to install a new top level interpreter to make it possible, among
> other things.  (It seems to me that maybe this should check some
> property of the ui_file and not the interpreter, but that's a much
> larger patch...)
> 
> Tom
Thanks for the investigations.  If you deem it useful, I can do
some manual validation of the patch, waiting for the test case and/or
unit test.

Philippe
  
Tom Tromey Jan. 7, 2019, 2:48 p.m. UTC | #4
>>>>> "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:

Philippe> Thanks for the investigations.  If you deem it useful, I can do
Philippe> some manual validation of the patch, waiting for the test case and/or
Philippe> unit test.

It's in crude form on my github, branch submit/fix-pager.

Tom
  
Philippe Waroquiers Jan. 7, 2019, 4:56 p.m. UTC | #5
On Mon, 2019-01-07 at 07:48 -0700, Tom Tromey wrote:
> > > > > > "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:
> 
> Philippe> Thanks for the investigations.  If you deem it useful, I can do
> Philippe> some manual validation of the patch, waiting for the test case and/or
> Philippe> unit test.
> 
> It's in crude form on my github, branch submit/fix-pager.
> 
> Tom
Seems to work much better, but I still found 2 strange things:

I debugged gdb with this gdb, did various commands, and then a bt full
which was ok:
(top-gdb) bt full
#0  0x00007f0b1ff97660 in __poll_nocancel () at ../sysdeps/unix/syscall-template.S:84
No locals.
#1  0x000055bd7edc2af1 in poll (__timeout=-1, __nfds=<optimized out>, __fds=<optimized out>)
    at /usr/include/x86_64-linux-gnu/bits/poll2.h:46
No locals.
#2  gdb_wait_for_event (block=block@entry=1) at ../../binutils-gdb/gdb/event-loop.c:772
        timeout = -1
        file_ptr = <optimized out>
        num_found = 0
        __PRETTY_FUNCTION__ = "int gdb_wait_for_event(int)"


I changed the width to 40, and then there were a few lines and spaces before the  #0 
(I am not completely sure how to reproduce the below.  You might need to quit or C-c
a previous paged command.  So maybe this is the same problem as the next one
(maybe some data that stays in a buffer after a quit or C-c).

(top-gdb) set width 40
(top-gdb) bt full

          #0  0x00007f0b1ff97660 in __poll_nocancel ()
    at ../sysdeps/unix/syscall-template.S:84
No locals.
#1  0x000055bd7edc2af1 in poll (
    __timeout=-1, 
    __nfds=<optimized out>, 
    __fds=<optimized out>)
    at /usr/include/x86_64-linux-gnu/bits/poll2.h:46
No locals.
#2  gdb_wait_for_event (
    block=block@entry=1)
...


Also, when doing q (to stop paging):
...
#3  0x000055bd7edc2c54 in gdb_do_one_event ()
    at ../../binutils-gdb/gdb/event-loop.c:347
        number_of_sources = <optimized out>
        current = 3
        event_source_head = 2
        res = <optimized out>
#4  0x000055bd7edc2de5 in gdb_do_one_event ()
<continue without paging--q
 at ../../binutils-gdb/gdb/common/cQuit
(top-gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
...

We still have the ' at ../../binutils-gdb/gdb/common/cQuit'
shown after the quit. It is shown in green, and then (top-gdb)
and all what follows (the help command, and its output) is in
green.
The color goes back to normal as soon as a command produces
some styled output (e.g.  p $sp).


Also, the msg at the end of each page also appears at different columns,
e.g.

...
#14 0x000055bd7edc37a9 in gdb_rl_callback_read_char_wrapper (
    client_data=<optimized out>)
    at ../../binutils-gdb/gdb/event-top.c:192
        gdb_expt = <optimized out>
<continue without paging--
#15 0x000055bd7edc3d50 in stdin_event_handler (error=<optimized out>, 
    client_data=0x55bd813aa840)
    at ../../binutils-gdb/gdb/event-top.c:511
        ui = 0x55bd813aa840
...
        exception_try_scope_instance = <optimized out>
        ex = <optimized out>
#22 gdb_main (args=<optimized out>)
    at ../../binutils-gdb/gdb/main.c:1193
        exception_try_scope_instance = {<continue without paging--
...


So, maybe something colored is still in a buffer, that is flushed
at various moments ?

Note that I also produced the above symptoms by playing
with set height 8, and quitting or C-c at various 'continue msg'.

Philippe
  
Tom Tromey Jan. 12, 2019, 5:03 p.m. UTC | #6
>>>>> "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:

Philippe> I changed the width to 40, and then there were a few lines and spaces before the  #0 
Philippe> (I am not completely sure how to reproduce the below.  You might need to quit or C-c
Philippe> a previous paged command.  So maybe this is the same problem as the next one
Philippe> (maybe some data that stays in a buffer after a quit or C-c).

I think I've figured this out and I pushed a new patch to my WIP branch
to address it.  Could you try it out?  I still haven't written the test
case but hopefully this weekend.

Tom
  
Philippe Waroquiers Jan. 12, 2019, 5:55 p.m. UTC | #7
On Sat, 2019-01-12 at 10:03 -0700, Tom Tromey wrote:
> > > > > > "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:
> 
> Philippe> I changed the width to 40, and then there were a few lines and spaces before the  #0 
> Philippe> (I am not completely sure how to reproduce the below.  You might need to quit or C-c
> Philippe> a previous paged command.  So maybe this is the same problem as the next one
> Philippe> (maybe some data that stays in a buffer after a quit or C-c).
> 
> I think I've figured this out and I pushed a new patch to my WIP branch
> to address it.  Could you try it out?  I still haven't written the test
> case but hopefully this weekend.

I have tested the last version.

Just two minor things found with the pager prompt:


Using (this patched) gdb to debug itself:
(top-gdb) show height
Number of lines gdb thinks are in a page is 24.
(top-gdb) show width
Number of characters gdb thinks are in a line is 80.
(top-gdb) 

Put a breakpoint in the style function:
(top-gdb) break style

In the inferior gdb, do
(gdb) info breakpoints

When the style breakpoint is encountered, do
(top-gdb) bt full

The 4th page prompt is not at the first column:
...
#9  0x000055b36e50b6f1 in execute_command (p=<optimized out>, 
    p@entry=0x55b36f6d4230 "info breakp", from_tty=1)
    at ../../gdb/gdb/top.c:630
        without_whitespace = {static npos = 18446744073709551615, 
          _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No
data fields>}, <No data fields>}, _M_p = 0x7ffd285ad140 ""}, 
          _M_string_length = 0, {
            --Type <RET> for more, q to quit, c to continue without paging--



For the same test, GDB 8.2 gives:
#9  0x000055b36e50b6f1 in execute_command (p=<optimized out>, 
    p@entry=0x55b36f6d4230 "info breakp", from_tty=1)
    at ../../gdb/gdb/top.c:630
        without_whitespace = {static npos = 18446744073709551615, 
          _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No
data fields>}, <No data fields>}, _M_p = 0x7ffd285ad140 ""}, 
--Type <RET> for more, q to quit, c to continue without paging--


Note that this behaviour is not very easy to produce.  You might be
more (un-)lucky by using e.g.
   set height 3
and then do bt full,
so as to have more page prompts.




The second thing:
-----------------

(top-gdb) set height 3
(top-gdb) info var some
All variables matching regular expression "some":

--Type <RET> for more, q to quit, c to continue without paging--
File ./complete.c:
344:	rl_compignore_func_t *rl_ignore_some_completions_function;
--Type <RET> for more, q to quit, c to continue without paging--

Non-debugging symbols:
--Type <RET> for more, q to quit, c to continue without paging--
--Type <RET> for more, q to quit, c to continue without paging--
0x000055b36e7bbc20  iterate_over_some_symtabs(char const*, char const*, compunit_symtab*,
compunit_symtab*, gdb::function_view<bool (symtab*)>)::__PRETTY_FUNCTION__
(top-gdb) 

As you can see, we have 2 successive pager prompts, but no
info in between.
GDB 8.2 does not show such behaviour.

Thanks

Philippe
  
Philippe Waroquiers Jan. 12, 2019, 9:08 p.m. UTC | #8
Another thing:

(top-gdb) bt
#0  0x00007f6a9f44c660 in __poll_nocancel () at ../sysdeps/unix/syscall-template.S:84
#1  0x0000562224a0fe51 in poll (__timeout=-1, __nfds=<optimized out>, __fds=<optimized out>) at /usr/include/x86_64-linux-gnu/bits/poll2.h:46

In the above, the 'at' in the first line is black, and the filename is green,
as expected.

When doing
(top-gdb) set width 60
(top-gdb) bt
#0  0x00007f6a9f44c660 in __poll_nocancel ()
    at ../sysdeps/unix/syscall-template.S:84
#1  0x0000562224a0fe51 in poll (__timeout=-1, 
    __nfds=<optimized out>, __fds=<optimized out>)
    at /usr/include/x86_64-linux-gnu/bits/poll2.h:46

then the 'at' becomes also green.

Philippe

On Sat, 2019-01-12 at 18:55 +0100, Philippe Waroquiers wrote:
> On Sat, 2019-01-12 at 10:03 -0700, Tom Tromey wrote:
> > > > > > > "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:
> > 
> > Philippe> I changed the width to 40, and then there were a few lines and spaces before the  #0 
> > Philippe> (I am not completely sure how to reproduce the below.  You might need to quit or C-c
> > Philippe> a previous paged command.  So maybe this is the same problem as the next one
> > Philippe> (maybe some data that stays in a buffer after a quit or C-c).
> > 
> > I think I've figured this out and I pushed a new patch to my WIP branch
> > to address it.  Could you try it out?  I still haven't written the test
> > case but hopefully this weekend.
> 
> I have tested the last version.
> 
> Just two minor things found with the pager prompt:
> 
> 
> Using (this patched) gdb to debug itself:
> (top-gdb) show height
> Number of lines gdb thinks are in a page is 24.
> (top-gdb) show width
> Number of characters gdb thinks are in a line is 80.
> (top-gdb) 
> 
> Put a breakpoint in the style function:
> (top-gdb) break style
> 
> In the inferior gdb, do
> (gdb) info breakpoints
> 
> When the style breakpoint is encountered, do
> (top-gdb) bt full
> 
> The 4th page prompt is not at the first column:
> ...
> #9  0x000055b36e50b6f1 in execute_command (p=<optimized out>, 
>     p@entry=0x55b36f6d4230 "info breakp", from_tty=1)
>     at ../../gdb/gdb/top.c:630
>         without_whitespace = {static npos = 18446744073709551615, 
>           _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No
> data fields>}, <No data fields>}, _M_p = 0x7ffd285ad140 ""}, 
>           _M_string_length = 0, {
>             --Type <RET> for more, q to quit, c to continue without paging--
> 
> 
> 
> For the same test, GDB 8.2 gives:
> #9  0x000055b36e50b6f1 in execute_command (p=<optimized out>, 
>     p@entry=0x55b36f6d4230 "info breakp", from_tty=1)
>     at ../../gdb/gdb/top.c:630
>         without_whitespace = {static npos = 18446744073709551615, 
>           _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No
> data fields>}, <No data fields>}, _M_p = 0x7ffd285ad140 ""}, 
> --Type <RET> for more, q to quit, c to continue without paging--
> 
> 
> Note that this behaviour is not very easy to produce.  You might be
> more (un-)lucky by using e.g.
>    set height 3
> and then do bt full,
> so as to have more page prompts.
> 
> 
> 
> 
> The second thing:
> -----------------
> 
> (top-gdb) set height 3
> (top-gdb) info var some
> All variables matching regular expression "some":
> 
> --Type <RET> for more, q to quit, c to continue without paging--
> File ./complete.c:
> 344:	rl_compignore_func_t *rl_ignore_some_completions_function;
> --Type <RET> for more, q to quit, c to continue without paging--
> 
> Non-debugging symbols:
> --Type <RET> for more, q to quit, c to continue without paging--
> --Type <RET> for more, q to quit, c to continue without paging--
> 0x000055b36e7bbc20  iterate_over_some_symtabs(char const*, char const*, compunit_symtab*,
> compunit_symtab*, gdb::function_view<bool (symtab*)>)::__PRETTY_FUNCTION__
> (top-gdb) 
> 
> As you can see, we have 2 successive pager prompts, but no
> info in between.
> GDB 8.2 does not show such behaviour.
> 
> Thanks
> 
> Philippe
>
  
Tom Tromey Jan. 14, 2019, 3:54 a.m. UTC | #9
>>>>> "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:

Philippe> When doing
Philippe> (top-gdb) set width 60
Philippe> (top-gdb) bt
Philippe> #0  0x00007f6a9f44c660 in __poll_nocancel ()
Philippe>     at ../sysdeps/unix/syscall-template.S:84
Philippe> #1  0x0000562224a0fe51 in poll (__timeout=-1, 
Philippe>     __nfds=<optimized out>, __fds=<optimized out>)
Philippe>     at /usr/include/x86_64-linux-gnu/bits/poll2.h:46

Philippe> then the 'at' becomes also green.

I fixed this one on my branch.  I haven't researched the other two
problems yet.

Tom
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7be4360e62..0d1fcb79f1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@ 
+2018-12-30  Tom Tromey  <tom@tromey.com>
+
+	* utils.c (flush_wrap_buffer): Only flush gdb_stdout.
+
 2018-12-30  Tom Tromey  <tom@tromey.com>
 
 	* event-top.h (command_line_handler): Update.
diff --git a/gdb/utils.c b/gdb/utils.c
index 3a6f796f2b..753eb14280 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1589,7 +1589,7 @@  reinitialize_more_filter (void)
 static void
 flush_wrap_buffer (struct ui_file *stream)
 {
-  if (!wrap_buffer.empty ())
+  if (stream == gdb_stdout && !wrap_buffer.empty ())
     {
       fputs_unfiltered (wrap_buffer.c_str (), stream);
       wrap_buffer.clear ();