Re: debugging a program that uses SIGTRAP

Joel Brobecker
2007-03-21T14:14:40Z

> Okay. I thought somehow GDB would pass SIGTRAP iff it knows it has
> not set a breakpoint on the current instruction pointer by scanning
> its list of breakpoints.
>
> > Even if you get past that point, your handler will now get called
> > every time GDB hits a breakpoint or single steps - single stepping
> > will probably be broken.
>
> Would the above suggestion be reasonable? I think it would behave
> nicer than what I have now, especially for my circumstance, since
> there isn't any overlap between the code I'm trying to debug and the
> code _it's_ trying to debug.

As Daniel said, this is one of the trickiest parts of GDB. At first
glance, I think your suggestion above will not work, because of single
stepping. Each single-step operation ends with a SIGTRAP at the location
where the single-step finished, and chances are you have no breakpoint
at that location. This SIGTRAP is not to be passed back to the inferior.
You may think of adding some extra logic that guesses whether the SIGTRAP
comes from your single-step or from another source, but I think the logic
will be very fragile. Normally, all you are guarantied is that the program
will stop once it gets outside a given code range. But in fact, in can
stop anytime, even when inside that range. Try "set debug infrun 1" and
then do a few single steps; have a look at the output on x86-linux.

The way to achieve what you are suggesting, I think, is to use "software
single-step", which means single-stepping achieved by way of breakpoints
rather than using the kernel single-step. I don't think this is
implemented on x86, however.

Sorry, but I think you're pretty much stuck in your case. Can you not
use anything other than SIGTRAP?

--
Joel