From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kevin Buettner To: "H . J . Lu" , GDB Subject: Re: Problem with debugging ld.so Date: Tue, 02 Oct 2001 14:11:00 -0000 Message-id: <1011002211056.ZM21604@ocotillo.lan> References: <20011002123039.A3457@lucon.org> X-SW-Source: 2001-10/msg00032.html On Oct 2, 12:30pm, H . J . Lu wrote: > # gdb /lib/ld-linux.so.2 > ... > (gdb) r > ... > (gdb) b dl_main > Cannot access memory at address 0x80002550 > > It looks like after ld.so is run, I can no longer set breakpoints > in ld.so. BTW, this doesn't only happen when debugging ld.so - which is a rather arcane situation for many of us. GDB has problems setting breakpoints on functions in shared libraries (after the inferior has exited) for ordinary programs too. It's worked this way for as long as I can remember. Here's an example similar to H.J.'s, but using a "Hello, world" program instead: [kev@mesquite ctests]$ ../sourceware-solib-bld/gdb/gdb ./hello GNU gdb 2001-09-26-cvs (MI_OUT) Copyright 2001 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"... (gdb) b printf Breakpoint 1 at 0x804833c (gdb) r Starting program: /home/kev/ctests/./hello Breakpoint 1 at 0x4008c5e6: file printf.c, line 32. Breakpoint 1, printf (format=0x80484e8 "Hello, world!\n") at printf.c:32 32 printf.c: No such file or directory. in printf.c (gdb) c Continuing. Hello, world! Program exited normally. (gdb) quit [kev@mesquite ctests]$ ../sourceware-solib-bld/gdb/gdb ./hello GNU gdb 2001-09-26-cvs (MI_OUT) Copyright 2001 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"... (gdb) r Starting program: /home/kev/ctests/./hello Hello, world! Program exited normally. (gdb) b printf Cannot access memory at address 0x4008c5d4 I think GDB is correct in stating that it can't access memory at the given address. (It can't because the program has exited and the memory is truly no longer accessible.) What this suggests to me is that we need to have GDB clean things up a bit more after the program exits so that we have roughly the same state as before execution. If this were done, we'd be able to set a breakpoint on printf(). The initial breakpoint would be set on the PLT entry and would then later be moved to the actual function once the shared library has been loaded. (There may be other ways to do it too.) Kevin