it-swarm.com.ru

Отладка нескольких потоков в Eclipse

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

57
Shailesh Tainwala

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

34
Shamit Verma

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

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

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

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

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

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

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

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

set scheduler-locking on 

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

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

175
Erik Kaju

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

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

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

4
GauravKadyan

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

1
Jules Martel