gdb doesn't work very well with dynamic linked binaries
Mark Kettenis
kettenis@wins.uva.nl
Thu Sep 7 03:09:00 GMT 2000
Date: Thu, 7 Sep 2000 04:55:38 -0400
From: James Cownie <jcownie@etnus.com>
Mark Kettenis wrote :-
I'm not sure whether the debug registers are
per-thread or per-VM-space in Linux. I'll probably need to look into
the kernel source.
To save you the time, they are per-thread, just like all the
other process' registers.
Thanks, that was what I suspected from looking at the code.
They are conceptually saved and restored on process scheduling
events (which for linuxthreads is the same thing as thread
scheduling events, since linuxthreads _are_ processes as far as
the scheduler is concerned).
Yep. This means that getting HW watchpoints working for
multi-threaded processes is a bit difficult, since GDB expects them to
be process-wide. So any HW watchpoints will have to be inserted in
*all* threads, not just one as we do now.
Eli, this probably means that adding the debugging registers to GDB's
register cache isn't a good idea. Something more specialized is
needed, i.e. a native-dependent interface that updates the address and
control register in all threads. This might implicate that keeping
the actual HW watchpoint support a native-only thing is a good idea.
The bug I mentioned previously is exactly that they're getting
cleared by the kernel and then not getting restored on return
to user space, leaving them wrong until the next reschedule :-(
I think I understand the problems now. It basically means that one
cannot reliably watch area's that are somehow used in system calls.
I suspect that Linux isn't the only kernel with this bug. AFAICS
FreeBSD also simply disables any (user-space) watchpoints triggered
from within the kernel. I don't know what the various x86 System V's
(Solaris, SCO Open Server 5) do, but I wouldn't be surprised if it is
broken there too.
Mark
More information about the Gdb
mailing list