First, you need to enable comfortable for multi-threading debugger behavior with the following commands. No idea why it's disabled by default.
set target-async 1
set non-stop on
I personally put those commands into .gdbinit file. They make your every command to be applied only to the currently focused thread. Note: the thread might be running, so you have to pause it.
To see the focused thread execute the thread
.
To switch to another thread append the number of the thread, e.g. thread 2
.
To see all threads with their numbers issue info thread
.
To apply a command to a particular thread issue something like thread apply threadnum command. E.g. thread apply 4 bt
will apply backtrace command to a thread number 4. thread apply all continue
continues all paused threads.
There is a small problem though — many commands needs the thread to be paused. I know a few ways of doing that:
interrupt
command: interrupts the thread execution, accepts a number of a thread to pause, without an argument breaks the focused one.
- Setting a breakpoint somewhere. Note that you may set a breakpoint to a particular thread, so that other threads will ignore it, like break linenum thread threadnum. E.g.
break 25 thread 4
.
You may also find very useful that you can set a list of commands to be executed when a breakpoint hit through the command commands
— so e.g. you may quickly print interesting values, then continue execution.