Когда GDB переключается на поток (скажем, t1) из другого (t2), как он координируется с ядром, поскольку ядро все еще может хотеть запустить t2 в течение некоторого периода времени.
По умолчанию GDB работает в режиме полного останова. Это означает, что все потоки останавливаются всякий раз, когда вы видите приглашение (gdb)
. Переключение между 2 остановленными потоками не требует какой-либо координации с ядром, поскольку ядро не будет запускать неработающие (остановленные) потоки.
В безостановочном режиме потоки, отличные от текущих, работают свободно, и ядро может и будет планировать их выполнение по своему усмотрению.
когда шаг gdb отлаживается в одном конкретном потоке (с помощью команды "si"), как другие потоки запускаются (или полностью приостанавливаются) в течение этого периода?
Когда вы step
или stepi
, по умолчанию все потоки возобновляются. Вы можете контролировать это с помощью set scheduler-locking on
, и в этом случае будет возобновлен только один поток. Если вы забудете отключить блокировку планировщика и и выполнить continue
, будет возобновлена только текущая нить, что может вас запутать.
Документация .