By default, GDB stops all threads when any breakpoint is hit, and resumes all threads when you issue any command (such as continue
, next
, step
, finish
, etc.) which requires that the inferior process (the one you are debugging) start to execute.
However, you can tell GDB not to do that:
(gdb) help set scheduler-locking
Set mode for locking scheduler during execution.
off == no locking (threads may preempt at any time)
on == full locking (no thread except the current thread may run)
step == scheduler locked during every single-step operation.
In this mode, no other thread may run during a step command.
Other threads may run while stepping over a function call ('next').
So you'll want to set breakpoints, then set scheduler-locking on
, then continue
or finish
in thread 1 (thread 2 is still stopped), then Ctrl-C to regain control of GDB, switch to thread 2, continue
(thread 1 is still stopped), etc.
Beware: by setting scheduler-locking on
it is very easy to cause the inferior process to self-deadlock.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…