Можно ли остановить выполнение всех других потоков при достижении точки останова в GDB? - PullRequest
3 голосов
/ 13 мая 2009

Итак, как только я достиг точки останова в каком-либо потоке, возможно ли остановить другие потоки, пока я не продолжу?

Ответы [ 3 ]

4 голосов
/ 13 мая 2009

Когда ваша программа останавливается под GDB по любой причине, например, при достижении точки останова, остановятся все потоки выполнения, а не только текущий поток.

Проблема заключается в том, что при выполнении кода в одном потоке другие потоки могут выполнить более одного шага. Другая проблема заключается в том, что другие потоки останавливаются в середине оператора, а не на границе оператора, поэтому это может выглядеть немного грязно.

В дополнение к этому, как только «ваш» поток останавливается, если другой поток блокируется в системном вызове, системный вызов будет преждевременно возвращаться, так что вы получите забавные результаты, если только вы не будете специально кодировать, чтобы проверить это и перезапустить блокирующий вызов после сигнала.

Дополнительную информацию можно найти в Отладка с помощью GDB - Раздел 5.4 Остановка и запуск многопоточных программ , которые можно найти в разделе «Документация» на веб-сайте gdb.

Редактировать: похоже, что вам нужен нон-стоп режим. Похоже, эта версия имеет раздел 5.4.2, в котором обсуждается нон-стоп режим, которого нет у версии на сайте GNU .

2 голосов
/ 13 мая 2009

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

Когда вы продолжите остановленный поток, все другие потоки также продолжатся, если вы не выполните set scheduler-locking on. Обратите внимание, что любой из step, next и т. Д. продолжает текущий (и, следовательно, все остальные) поток (после установки временной точки останова в соответствующем месте, например, на следующей строке для команды next) .

Возможно, вы хотите иметь возможность одношаговой остановки потока без возобновления работы всех остальных потоков? В этом случае set scheduler-locking on является ответом.

Осторожно: если другой поток удерживает блокировку, вы включаете блокировку планировщика, и ваш текущий поток также требует такой же блокировки, ваша программа будет ждать бесконечно долго. Это часто происходит, если один из потоков находится внутри malloc / realloc, и ваш текущий оператор пытается выделить немного памяти.

Также не забудьте set scheduler-locking off до continue, иначе только текущий поток будет продвигаться вперед.

1 голос
/ 13 мая 2009

Это значение по умолчанию для GDB. включить Non-Stop Mode use , установлен нон-стоп .

...