Как многопотоковая отладка gdb согласуется с планированием потоков Linux? - PullRequest
0 голосов
/ 27 апреля 2018

При отладке многопоточной программы с использованием GDB можно сделать

1. switching between existing thread
2. step debugging 
3. etc.

Между тем, процесс и его потоки как ресурс ОС управляются и контролируются Ядром Linux. Когда GDB переключается на поток (скажем, t1) из другого (t2), как он координируется с ядром, поскольку ядро ​​все еще может хотеть запустить t2 в течение некоторого периода времени. Также, когда шаг gdb отлаживается в одном конкретном потоке (с помощью команды "si"), как другие потоки запускаются (или полностью приостанавливаются) в течение этого периода?

1 Ответ

0 голосов
/ 27 апреля 2018

Когда GDB переключается на поток (скажем, t1) из другого (t2), как он координируется с ядром, поскольку ядро ​​все еще может хотеть запустить t2 в течение некоторого периода времени.

По умолчанию GDB работает в режиме полного останова. Это означает, что все потоки останавливаются всякий раз, когда вы видите приглашение (gdb). Переключение между 2 остановленными потоками не требует какой-либо координации с ядром, поскольку ядро ​​не будет запускать неработающие (остановленные) потоки.

В безостановочном режиме потоки, отличные от текущих, работают свободно, и ядро ​​может и будет планировать их выполнение по своему усмотрению.

когда шаг gdb отлаживается в одном конкретном потоке (с помощью команды "si"), как другие потоки запускаются (или полностью приостанавливаются) в течение этого периода?

Когда вы step или stepi, по умолчанию все потоки возобновляются. Вы можете контролировать это с помощью set scheduler-locking on, и в этом случае будет возобновлен только один поток. Если вы забудете отключить блокировку планировщика и и выполнить continue, будет возобновлена ​​только текущая нить, что может вас запутать.

Документация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...