public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Cleber Rosa <crosa@redhat.com>
To: Pedro Alves <palves@redhat.com>, gdb-patches@sourceware.org
Cc: areis@redhat.com, Sergio Durigan Junior <sergiodj@redhat.com>
Subject: Re: [PATCH 0/4] GDBServer: introduce a dedicated stderr stream
Date: Tue, 24 Mar 2015 17:07:00 -0000	[thread overview]
Message-ID: <551199CF.2000400@redhat.com> (raw)
In-Reply-To: <550D889C.3030900@redhat.com>

On 03/21/2015 12:05 PM, Pedro Alves wrote:
> On 03/21/2015 02:34 AM, Cleber Rosa wrote:
>> This  patch series add command line options and monitor commands that
>> will redirect all of the gdbserver's own output (always sent to stderr)
>> to a separate file. This feature makes it possible to distinguish between
>> the inferior process stderr and gdbserver's own stderr.
> A specific FILE* is a fragile approach; libraries that gdbserver loads
> may well print to stdout/stderr or write to file descriptors 1 or
> 2 directly, for example.  If we're doing this, redirection is best done
> at the lower OS file descriptor layer, not at C-runtime stdio (stdout/stderr)
> layer, with e.g., dup/dup2.

I do agree with the fragility of the method chosen.  The truth is that 
all other approaches I considered turned out to be, IMHO, excessively 
complex and cumbersome for what was trying to be achieved.

>
> And, gdbserver itself may print to stdout/stderr _before_ the redirection
> command-line option is processed.  Thus it's safer/better to just start gdbserver
> with its input/output redirected already.  Of course, then because new
> inferiors inherit the input/output from gdbserver, we'd need a way to
> start the inferior with input/output redirected somewhere instead.

You're absolutely right that loaded libraries can write to the file 
descriptor this patch is trying to "protect", and so can instrumented 
commands during a debug session and possibly many others, other than 
gdbserver itself.  Even new code that slips into gdbserver itself may 
end up breaking this "contract".

At this point, it looks like I'm advocating, or even proving, that the 
chosen approach is too fragile.  But, my real point is that given the 
nature of the application itself and its typical users, this looked like 
the best balance between "simple enough" and "safe enough".  I also 
believe that if this feature gets enough users, violations of this 
"contract" would be readily caught and fixed. This could even evolve 
towards a unified way for gdbserver and libraries to announce errors 
(instead of printf()s).

I tried to map the code flow, and looking at server.c:main() and 
captured_main(), it looks pretty safe to assume that gdbserver itself 
won't write to stderr. This is a snippet from the proposed 
server.c:captured_main():

   server_output = stderr;

   while (*next_arg != NULL && **next_arg == '-')
     {
       if (strncmp (*next_arg, "--server-output=",
            sizeof ("--server-output=") - 1) == 0)
     {
       char *out_filename = *next_arg + (sizeof ("--server-output=") - 1);
       set_server_output (out_filename);
     }

Note that the output swap (set_server_output()) happens very early, and 
this increases my confidence of not having "bad" output from gdbserver 
itself.

>
> When native debugging, we can already do exactly that: we can
> tell gdb to starts inferior with input/output redirected, using the
> "set inferior-tty" command.  I'd be very desirable to be able to do that
> with gdbserver as well, in the context of local/remote parity too.  That makes
> it possible to have one single gdbserver start multiple programs on separate
> ttys, for example.
>
> And I think that would cover your use case too.
> You'd start gdbserver with input/output redirected to a pipe, like you
> seem to already do (for example), and pass it --inferior-tty=`tty` so
> that new inferiors start with input/output connected to that tty.

I actually tried that approach many months ago[1]. I was actually 
expecting the feature parity between gdb and gdbserver, and it kind of 
let me down. But, even with an exclusive TTY for the inferior, one big 
gap would remain: no clean way to differentiate between an application 
STDOUT and STDERR simply by reading from its TTY.

>
> What do you think?
>
> The code to do this in gdb is in fork-child.c and inflow.c.  Ideally
> we'd share it with gdbserver...  Sergio has been on and off working
> on exactly sharing that code, for startup-with-shell.

My dream feature set would be gdb supporting redirection *including* 
STDERR (doesn't seem to be the case right now[2]), and gdbserver with 
complete feature parity. Sorry if this is too selfish (but it's honest): 
this dream feature set looks too expensive at this time.

So, to sum it up, here's my plea: the proposed changes, fragile indeed 
but effective, have a very clear use case. The overlap is minimal to 
non-existing with future work getting gdbserver in feature parity with gdb.

>
> Thanks,
> Pedro Alves
>

Thanks again for the very fertile comments and review!
Cleber Rosa.

[1] - 
https://github.com/clebergnu/avocado/commit/fc813a5d047c7741ee603e00e638ef342c7997b6
[2] - 
https://sourceware.org/gdb/current/onlinedocs/gdb/Input_002fOutput.html#Input_002fOutput

  reply	other threads:[~2015-03-24 17:07 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-21  2:35 Cleber Rosa
2015-03-21  2:35 ` [PATCH 1/4] GDBServer: introduce a stderr stream dedicated to the server Cleber Rosa
2015-03-21  2:35 ` [PATCH 2/4] GDBServer: give more complete usage information Cleber Rosa
2015-03-21 17:05   ` Pedro Alves
2015-03-24 14:15     ` Cleber Rosa
2015-03-31 14:44       ` Cleber Rosa
2015-04-01 10:10       ` Pedro Alves
2015-03-21  2:35 ` [PATCH 3/4] GDBServer: introduce --server-stderr command line option Cleber Rosa
2015-03-21  8:26   ` Eli Zaretskii
2015-03-23 18:51     ` Cleber Rosa
2015-03-23 19:12       ` Eli Zaretskii
2015-03-23 20:35         ` Cleber Rosa
2015-03-23 20:43           ` Eli Zaretskii
2015-03-21  2:35 ` [PATCH 4/4] GDBServer: add 'monitor set server-stderr' command Cleber Rosa
2015-03-21  8:29   ` Eli Zaretskii
2015-03-23 20:09     ` Cleber Rosa
2015-03-21 15:05 ` [PATCH 0/4] GDBServer: introduce a dedicated stderr stream Pedro Alves
2015-03-24 17:07   ` Cleber Rosa [this message]
2015-04-01 11:17     ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=551199CF.2000400@redhat.com \
    --to=crosa@redhat.com \
    --cc=areis@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    --cc=sergiodj@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).