Отладка нескольких потоков в Eclipse - PullRequest
59 голосов
/ 21 марта 2011

В методе, который я отлаживаю, я создаю новый поток. Мне нужно отладить выполнение этого нового потока, а не родительского потока. Как я могу сделать это в затмении?

Ответы [ 4 ]

176 голосов
/ 28 марта 2012

В дополнение к ответу Шамита Вермы:

При работе с отладочными многопоточными Java приложениями лучше не использовать стандартные точки останова, которые приостанавливают только поток, в котором установлена ​​точка останова,Определение стандартной точки останова в вашем приложении приведет к разрыву только связанного потока.Другие потоки все еще будут работать.В eclipse отладчик по какой-то причине заставит отладчик пропускать точки останова, если другие потоки уже запущены.

Решение для отладки Java:

Определение точки останова в нужном потоке (метод @ Run () iожидайте ..), щелкните правой кнопкой мыши точку останова -> свойства точки останова.

В диалоговом окне свойств точки останова установите флажок «Приостановить виртуальную машину» вместо «Приостановить поток».

Если вы делаете это так, то всеВиртуальная машина будет приостановлена ​​в случае достижения точки останова.

В C / C ++ CDT используйте установить блокировку планировщика на :

As@Employed Russian говорит, что в answer-to-other-question команда GDB:

set scheduler-locking on 

приведет к тому, что другие потоки C / C ++ останутся приостановленными, в то время как текущий поток сможет перейти к следующему шагу.Эту команду можно выполнить в Eclipse / CDT Debug, приостановив выполнение программы и открыв перспективу «Debugger Console» и введя: установить блокировку планировщика на Позже ее можно вернуть в нормальное состояние с помощью: set планировщик-locking off

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

35 голосов
/ 21 марта 2011

Поместите точку останова в метод "run" нового потока.Это остановит выполнение после запуска потока.

4 голосов
/ 12 июня 2014

В дополнение к ответу Эрика Каджу. Если вы отлаживаете CDT (это может быть применимо и для Java, я не уверен в этом), то

  1. Поместите точку останова в метод run () (или его эквивалент). Или в любой момент, когда вы уверены, что требуемые и ненужные потоки (те, которые будут удалены фильтром) работают одновременно.
  2. Запустить сеанс отладки.
  3. Когда достигается точка останова в режиме выполнения, вы можете перейти к другой точке останова, включить эту точку останова, если она была отключена. Затем щелкните правой кнопкой мыши по точке останова -> перейдите в Фильтры, теперь вы можете выбрать поток, для которого хотите, чтобы точка останова оставалась включенной, и вы можете снять флажки с остальных потоков. Так что эта точка останова будет достигнута только для этого конкретного потока.

Недостаток - эта процедура должна повторяться для каждого сеанса отладки. Если кто-то может предоставить короткий путь для этого, то это было бы хорошо.

2 голосов
/ 03 марта 2017

в вашем окне отладки затмения вы можете перейти потоки, чтобы приземлиться на нужный номер рабочего потока и продолжить последовательное исследование (F6). enter image description here

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