Re: [RFC PATCH 0/3] Pretty-printing for errno
Zack Weinberg <[email protected]>
| Newsgroups | gmane.comp.gdb.devel,gmane.comp.lib.glibc.alpha |
|---|---|
| Message-ID | <CAKCAbMgsHH9bJCgELWY6R9sWaZvdqGjdfUFDLihx3mor8HofGw@mail.gmail.com> |
On Tue, Sep 5, 2017 at 6:31 PM, Pedro Alves <[email protected]> wrote: > On 09/05/2017 10:15 PM, Zack Weinberg wrote: >> >> 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? That is correct. > 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. I am not familiar with the glibc-side TLS implementation, nor with libthread_db.so, nor the code in GDB that uses libthread_db.so. However, reading the implementation of td_thr_tls_get_addr leads me to believe that that function is *supposed* to work even if libpthread.so has not been loaded into the 'inferior'. If it doesn't, perhaps that is a bug on our side. Do you know if GDB even tries? It's not obvious to me looking at linux-thread-db.c. > 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. Again, is it possible to do (the equivalent of) this from the initialization code of a pretty-printer module? Specifically, there already exists a Python function that's doing this: def register(objfile): """Register pretty printers for the current objfile.""" printer = gdb.printing.RegexpCollectionPrettyPrinter("glibc-errno") printer.add_printer('error_t', r'^(?:__)?error_t', ErrnoPrinter) if objfile == None: objfile = gdb gdb.printing.register_pretty_printer(objfile, printer) called when the module is loaded; what would I need to add to that so that the macro is defined (if it isn't already)? zw