Re: Response to gdb multithreaded breakpoints' problem

Doug Evans <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <CAP9bCMT2GmxUKhWnYxaszkH3XJQD-2v+Ehbg5F4f8zL1Wi0g3g@mail.gmail.com>
On Tue, May 13, 2014 at 6:07 AM, Sophia Rodina <[email protected]> wrote:
>
> On 11 May 2014 07:27, Luis Machado<[email protected]
> <mailto:[email protected]>>wrote:
>
>     On 05/10/2014 06:56 PM, Sofia wrote:
>
>         I'm writing my GDB stub and trying to set breakpoints on
>         different threads.
>         When I don't ask GDB about the number of threads, It works fine
>         as a single-
>         threaded application and breakpoints are set correctly. But when
>         I enter -
>         'info threads', something strange happens.
>
>         Firstly, GDB reads the contents of all threads' registers(it's
>         OK). Then I
>         enter 'continue' and see that breakpoints are not set at all
>         threads my
>         program has. I don't understand why, but the packet
>         Z0(breakpoint packet) is
>         only sent to inactive thread. The documentation says that if the
>         thread id is
>         not specified, breakpoints will be set at all threads. What's
>         wrong with this
>         or where can I read about such GDB behavior?
>
>
>
>
>     Is this a software breakpoint (Z0/z0) or a hardware breakpoint we
>     are talking about?
>
>     A software breakpoint should be valid for all threads if the threads
>     are executing a shared piece of code. If these breakpoints are not
>     triggering, we may have a bug somewhere.
>
>     For hardware breakpoints, the target code (in this case, the remote
>     stub) is responsible for replicating the hardware breakpoint
>     settings (register contents) to all threads upon their creation.
>
>     What version of GDB are you using?
>
>
> No, It's a software breakpoint. I set it as [b *addr].

The distinction between "software breakpoint" and "hardware
breakpoint" is how they are implemented on the target.
Either can be used to implement "b *addr".
The canonical example is i386(/amd64) where a "software breakpoint"
uses the "int3" instruction and a "hardware breakpoint" uses the i386
debug registers.

> My gdb-multiarch version is GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
>
> How is breakpoints' setting implemented in gdb? I expect gdb to switch
> between all currently active threads and send (Z0, addr) packet to all
> of them. And it definitely doesn't do what I expect. So, how gdb should
> behave in such cases?

gdb leaves it to the stub to do whatever may be necessary to install
the breakpoint on all threads.
In the case of i386-linux, gdbserver monitors the creation of new
threads, and whenever a new thread is detected h/w breakpoints (or
watchpoints) are automagically installed in the new thread (since the
i386 debug registers are thread-specific).

gdb sets the breakpoint on only the inactive thread because at least
on linux the ptrace system call, which is used to install breakpoints,
can only be used on a thread that is stopped.
In the case of a "software breakpoint" (which is what I see being used
in your case: Z0) it is sufficient to only set it on one thread
because all threads share the same code space (and thus once set in
one thread it will be visible to all threads - at least conceptually -
if, e.g., a cache flush is needed in order to make the breakpoint
visible to all threads then the stub needs to do this).

> I attach my logs(packets and responses of gdbstub and gdb-client), maybe
> they will better explain what is going on.
> I divided it into several parts for easier navigation.
>
> 1.  INITIALIZATION
> 2.  AFTER INFO THREADS COMMAND
> 3. CONTINUE
> 4.  CTRL+C IN GDB
> 5. b *0xbff77660
> 6. CONTINUE AFTER BREAKPOINT SETTING

The relevant part is here:

GDB: Receiving the packet...
GDB: Packet Z0,bff77660,4#4e was received from host.
GDB: Sending acknowledgement :)
GDB(mp_find): Matchpoint of type 0 at addr bff77660 was not found
GDB: Breakpoint was set at addr bff77660, removed opcode = 81e03003 on vcpu 1
GDB: Response packet = ($OK#9a)

Question: Is it not possible for your stub to install the breakpoint
on all threads?
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.