From: Luis Machado <lgustavo@codesourcery.com>
To: Pedro Alves <palves@redhat.com>, <gdb-patches@sourceware.org>
Cc: <gbenson@redhat.com>
Subject: Re: [PATCH 1/2] Debugging without a binary (regression)
Date: Thu, 25 Feb 2016 01:36:00 -0000 [thread overview]
Message-ID: <56CE5A9E.6030306@codesourcery.com> (raw)
In-Reply-To: <56CE5399.5060907@redhat.com>
On 02/24/2016 10:06 PM, Pedro Alves wrote:
> On 02/24/2016 02:26 PM, Luis Machado wrote:
>> When we attempt to debug a process using GDBserver in standard remote mode
>> without a symbol file on GDB's end, we may run into an issue where GDB cuts
>> the connection attempt short due to an error. The error is caused by not
>> being able to open a symbol file, like so:
>>
>> --
>>
>> (gdb) set sysroot
>> (gdb) tar rem :2345
>> Remote debugging using :2345
>> /proc/23769/exe: Permission denied.
>> (gdb) i r
>> The program has no registers now.
>> (gdb)
>>
>> It should've been like this:
>>
>> (gdb) set sysroot
>> (gdb) tar rem :2345
>> Remote debugging using :2345
>> 0xf7ddb2d0 in ?? ()
>> (gdb) i r
>> eax 0x0 0
>> ecx 0x0 0
>> edx 0x0 0
>> ebx 0x0 0
>> esp 0xffffdfa0 0xffffdfa0
>> ebp 0x0 0x0
>> esi 0x0 0
>> edi 0x0 0
>> eip 0xf7ddb2d0 0xf7ddb2d0
>> eflags 0x200 [ IF ]
>> cs 0x33 51
>> ss 0x2b 43
>> ds 0x0 0
>> es 0x0 0
>> fs 0x0 0
>> gs 0x0 0
>> (gdb)
>>
>> This is caused by a couple of function calls within exec_file_locate_attach
>> that can potentially throw errors.
>>
>> The following patch guards both exec_file_attach and symbol_file_add_main to
>> prevent the errors from disrupting the connection process.
>>
>> There was also a case where native GDB tripped on this problem, but it was
>> mostly fixed by bf74e428bca61022bd5cdf6bf28789a184748b4d.
>>
>> Regression-tested on x86-64/Ubuntu.
>>
>> gdb/ChangeLog:
>>
>> 2016-02-24 Luis Machado <lgustavo@codesourcery.com>
>>
>> * exec.c (exec_file_locate_attach): Guard a couple functions
>> that can throw errors.
>> ---
>> gdb/exec.c | 31 +++++++++++++++++++++++++++++--
>> 1 file changed, 29 insertions(+), 2 deletions(-)
>>
>> diff --git a/gdb/exec.c b/gdb/exec.c
>> index 90811c0..3f77b3d 100644
>> --- a/gdb/exec.c
>> +++ b/gdb/exec.c
>> @@ -176,8 +176,35 @@ exec_file_locate_attach (int pid, int from_tty)
>>
>> old_chain = make_cleanup (xfree, full_exec_path);
>>
>> - exec_file_attach (full_exec_path, from_tty);
>> - symbol_file_add_main (full_exec_path, from_tty);
>> + /* exec_file_attach and symbol_file_add_main may throw an error if the file
>> + cannot be opened either locally or remotely. This happens when, for
>> + example, GDB connects to a GDBserver that is running on a different
>> + filesystem and the sysroot is set to non-target-based (no "target:").
>
> The second sentence no longer makes sense after Gary's change.
>
> I think it should read:
>
> This happens for example, when the file is first found in the local
> sysroot (above), and then disappears (a TOCTOU race), or when it doesn't
> exist in the target filesystem, or when the file does exist, but
> is not readable.
>
Sounds good. Updated in the next version.
>> +
>> + Then GDB will neither load the binary from the target nor be able to
>> + load a binary from the local filesystem (it may not exist in the local
>> + filesystem in the same path as in the remote filesystem).
>
> No longer makes sense either.
>
Updated as well.
>> +
>> + Even without a binary, the remote-based debugging session should
>> + continue normally instead of ending abruptly. Hence we catch thrown
>> + errors/exceptions in the following code. */
>> + TRY
>> + {
>> + exec_file_attach (full_exec_path, from_tty);
>> + }
>> + CATCH (err, RETURN_MASK_ALL)
>
> This should be RETURN_MASK_ERROR instead. Silently swallowing ctrl-c is
> rarely the right thing to do, if ever. A ctrl-c during the
> initial remote connection is supposed to bring down the connection
> immediately:
Fixed
>> + {
>> + }
>> + END_CATCH
>> +
>> + TRY
>> + {
>> + symbol_file_add_main (full_exec_path, from_tty);
>> + }
>> + CATCH (err, RETURN_MASK_ALL)
>> + {
>> + }
>
> Throwing is bad, but, should we warn, including
> the exception message?
That's what i originally did with a single try/catch block, but i
noticed with two of them we are prone to having two warnings of the same
kind, one after the other. So i ended up leaving them empty.
For example:
warning:
/home/test/build-binutils-gdb/gdb/testsuite/outputs/gdb.server/attach-with-no-symbol/attach-with-no-symbol:
Permission denied.^M
warning:
/home/test/build-binutils-gdb/gdb/testsuite/outputs/gdb.server/attach-with-no-symbol/attach-with-no-symbol:
Permission denied.^M
Shouldn't we go back to a single block? Checking if both exceptions'
messages match seems a bit too much.
next prev parent reply other threads:[~2016-02-25 1:36 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-24 14:27 Luis Machado
2016-02-24 14:27 ` [PATCH 2/2] Test GDB connection to GDBserver with no symbol files Luis Machado
2016-02-25 1:26 ` Pedro Alves
2016-02-25 1:06 ` [PATCH 1/2] Debugging without a binary (regression) Pedro Alves
2016-02-25 1:36 ` Luis Machado [this message]
2016-02-25 2:09 ` 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=56CE5A9E.6030306@codesourcery.com \
--to=lgustavo@codesourcery.com \
--cc=gbenson@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=palves@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).