This is the mail archive of the
mailing list for the glibc project.
Re: [RFC PATCH 0/3] Pretty-printing for errno
- From: Pedro Alves <palves at redhat dot com>
- To: Zack Weinberg <zackw at panix dot com>
- Cc: Phil Muldoon <pmuldoon at redhat dot com>, GNU C Library <libc-alpha at sourceware dot org>, gdb at sourceware dot org, Joseph Myers <joseph at codesourcery dot com>, Florian Weimer <fweimer at redhat dot com>, tom at tromey dot com, Siddhesh Poyarekar <siddhesh at gotplt dot org>
- Date: Fri, 30 Jun 2017 17:37:49 +0100
- Subject: Re: [RFC PATCH 0/3] Pretty-printing for errno
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=palves at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 7C1A08008D
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7C1A08008D
- References: <firstname.lastname@example.org> <email@example.com> <firstname.lastname@example.org> <email@example.com> <firstname.lastname@example.org> <CAKCAbMgAwZOG95hpAAAVYJd4SP6j3aAahOf=WWedjNJkj7_JsA@mail.gmail.com>
On 06/30/2017 01:28 AM, Zack Weinberg wrote:
> On Thu, Jun 29, 2017 at 1:28 PM, Pedro Alves <email@example.com> wrote:
>> With this code:
>> typedef int zzz;
>> zzz z;
>> (gdb) whatis z
>> type = zzz
>> (gdb) whatis (zzz)0
>> type = zzz
>> (gdb) whatis zzz
>> type = int
I've now sent the patch to gdb-patches:
Could one of you check whether the type printer kicks in with that,
in the problematic cast case?
Phil, might it be a good idea to convert what you were
using to a real gdb testsuite test?
> For the glibc patch to go through, this case also needs to work:
> typedef int error_t;
> error_t var;
> extern error_t *errloc(void);
> int main(void)
> return *errloc();
> (compiled to .o file)
> (gdb) ptype errloc
> No symbol "errloc" in current context.
> This might be a problem with inadequate debugging information
> generated by the compiler
Debug info is generated for function definitions, not declarations.
I.e., that declaration for "errloc" alone produces no debug info
at all. Try 'readelf -dw' on the .o file.
But why is this a valid scenario? Even if you have no debug info,
GDB should be able to find the function's address in the elf dynamic
I'm not sure what you mean by "glibc patch to go through".
If you mean acceptance upstream, then I'd consider this a separate
issue, because now you're talking about being able to print the
"errno" variable in the first place, even as a plain int with no
printer? That is related, but orthogonal from the error_t type printer?
Otherwise, can you clarify?
-- it does work correctly if a function
> *definition* is visible. But we need it to work given only the above,
> possibly with no debug symbols in the shared library defining
Won't __errno_location be always present in the dynamic symbol table?
If you strip everything from libc.so.6 / libpthread.so.0 including
dynamic symbols, leaving gdb with no clue about "__errno_location",
let alone its address, there's no way that gdb can call it.
(Unless you call it by address manually.)
The next problem is that without debug info for __errno_location,
gdb has no clue of its prototype, only that its a function, and so
it assumes that it has type "int()", i.e., that it returns int,
while in reality it returns int * / __error_t *. (Falling back
to assuming "int" is IMO not the best idea, but I don't know
the history behind it.)
I.e., with your example .o + a separate .o file defining
errloc (with no debug info), we now get:
(gdb) ptype errloc
type = int ()
and then calling "p *errloc()" (the equivalent of
'#define errno (*__errno_location ())' silently subtly does
the wrong thing.
One dirty way around it would be for the printer to
re-define the errno macro (using to cast __errno_location to
the correct type before calling it, I guess:
(gdb) macro define errno *(*(__error_t *(*) (void)) __errno_location) ()
That's make "errno" available when you compile with levels
lower than -g3, too.
Fedora gdb has a morally equivalent hack in the source code
Ideally, we'd find a clean way to make this all Just Work.