This is the mail archive of the
libc-alpha@sourceware.org
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 Tromey <tom at tromey dot com>, Siddhesh Poyarekar <siddhesh at gotplt dot org>
- Date: Tue, 5 Sep 2017 23:31:55 +0100
- Subject: Re: [RFC PATCH 0/3] Pretty-printing for errno
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=palves at redhat dot com
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 341E67539D
- References: <20170622224456.1358-1-zackw@panix.com> <b2e7bc3b-d914-37ec-0215-2937949a848c@redhat.com> <3a7946e9-d178-f878-9774-64ff44bcf5df@redhat.com> <9490d183-a57b-b336-3131-6580e4773818@redhat.com> <be8d9730-96c5-79fa-b9bc-2afc02a17ddf@redhat.com> <CAKCAbMgAwZOG95hpAAAVYJd4SP6j3aAahOf=WWedjNJkj7_JsA@mail.gmail.com> <2f28f69b-406f-65e5-40e1-ae65632ea4f0@redhat.com> <CAKCAbMj8Rf374bss0ct+H+XMOu_o+_WWR2mQ-s8fb4-3_d7GjA@mail.gmail.com> <1d38297f-f430-ca73-6d3f-a67144d08eea@redhat.com> <d9fc4b9d-21b9-98fb-c87a-38b2e0587a9a@redhat.com> <7348d7d9-b339-b14f-3dea-31d17c996a2a@redhat.com> <CAKCAbMjbN9jQEjVg-0VQVV+QXP+J93wSkqZ=WC1-MDM4a4v=mQ@mail.gmail.com>
On 09/05/2017 10:15 PM, Zack Weinberg wrote:
> On Mon, Sep 4, 2017 at 5:25 PM, Pedro Alves <palves@redhat.com> wrote:
>>
>> FYI, this is now all in gdb master. I believe all the gdb issues
>> uncovered by the errno printer have been addressed. Let me know
>> if you're aware of something still not working properly.
>
> I'm sorry I never got around to experimenting with your patches before now.
Really no worries.
> With gdb master as of earlier today, and my patched glibc that tries
> to pretty-print errno, I can confirm that nearly everything works as
> desired. `p (error_t) 0` invokes the pretty-printer, and when
> preprocessor macro bodies are available to the debugger (-ggdb3) so
> does `p errno`. Unfortunately I am still getting this error message
> when I try to print the underlying thread-local errno variable (which
> is what `p errno` does if macro bodies are not available):
>
> Cannot find thread-local storage for process 4367, executable file
> /home/zack/projects/glibc/glibc-build/stdlib/test-errno-printer:
> Cannot find thread-local variables on this target
>
> I don't understand why thread-local variables are inaccessible on my
> perfectly ordinary x86_64-unknown-linux-gnu workstation (the base OS
> is Debian 'stretch'). Do you have any idea what might be wrong?
I assume your test program isn't actually linked with -pthread?
When you do "print errno" in this situation, because there's no
"#define errno ..." in sight, gdb ends up finding the real "errno" symbol,
which, even though the program isn't threaded, is a TLS symbol, and as such has
a DWARF location expression describing its location as an offset into the
thread-local block for the current thread. GDB needs to resolve that address, and
for threaded programs that is normally done with assistance from libthread_db.so.
The problem is then that libthread_db.so only works with programs that
link with libpthread.so, and if your test program is actually non-threaded,
it doesn't link with libpthread.so, So without libthread_db.so's assistance,
gdb cannot "find [the address of] thread-local variables on this target". The
error message is coming from generic GDB "get address of tls var" code several
layers above GNU/Linux-specific libthread_db.so-interaction code, but still
it could probably be made clearer, maybe by adding "the address of".
A workaround specifically for errno, and only for live-process debugging [*]
is the "macro define" trick I had suggested before:
(gdb) macro define errno (*__errno_location ())
After that, "p errno" ends up calling __errno_location just
like when you compile the test program with -g3.
[*] doesn't work with core file / postmortem debugging.
I don't know whether GDB could be able to resolve the location
of the errno variable for the main thread (for single-threaded
programs):
- without libthread_db.so assistance and
- without baking in awareness of glibc internal data structures
If there is I'd absolutely love to learn about it.
Thanks,
Pedro Alves