Eclipse и другие Java IDE для отладки параллельного кода - PullRequest
7 голосов
/ 13 июля 2010

В настоящее время я работаю над неким параллельным кодом, в котором может быть несколько условий гонки.Я пытаюсь отладить код, используя мою текущую IDE, Eclipse, но я не полностью удовлетворен.В частности, для переменной присутствует условие состязания, так что без точки останова в одном из методов, обращающихся к ней (в «получающем» ее), метод установки переменной не завершается, и переменная устанавливается в ноль.Однако, если я поставлю точку останова на метод доступа и удержу F8 - кнопку перехода по умолчанию - переменная почти всегда будет установлена ​​на правильное (ненулевое) значение.

Это выводит меняспросить следующее: возможно ли, что Eclipse не приостанавливает выполнение на точке останова во всех потоках достаточно быстро, чтобы я мог посмотреть на потенциальное состояние гонки, когда оно появляется без точки останова, или происходит что-то еще (вероятно)?

Если Eclipse не приостанавливает выполнение быстро, существуют ли другие IDE / отладчики для Java, которые могут справиться с этой задачей лучше?Обратите внимание, что я не ищу формальные средства проверки, такие как Java Pathfinder - я не хочу проверять наличие условий гонки, я хочу видеть их разворачивание в моем отладчике (хотя бы потому, что было бы интересно посмотреть).

Ответы [ 3 ]

9 голосов
/ 15 января 2012

По умолчанию Eclipse не будет приостанавливать другие потоки, если ваша точка останова достигнута одним потоком. Однако вы можете изменить это поведение в Window > Preferences > Java > Debug > Default suspend policy for new breakpoints => 'Suspend VM'.

4 голосов
/ 13 июля 2010

Это заставляет меня спросить следующее: возможно ли, что Eclipse не приостанавливает выполнение на точке останова во всех потоках достаточно быстро, чтобы я мог посмотреть на потенциальное состояние гонки, когда оно появляется без точки останова, иличто-то еще (вероятно) происходит?

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

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

Возможно, вам гораздо лучше рассуждать о коде и стратегиях, которые вы используете для обработкипараллельный код.Например, вы защищены общим состоянием с помощью блокировок?Как / что вы синхронизируете?Чтобы иметь возможность записи в переменную foo, какие шаги должны пройти потоки?

1 голос
/ 14 июля 2010

Помните, что доступ к / установка переменной не гарантируется за один шаг. Вы, вероятно, хотите использовать атомарный объект, чтобы быть уверенным.

И помните, что значение переменной может быть кэшировано. Чтобы убедиться, что он не кэшируется, используйте volatile.

И если вы забыли, вы можете установить точку останова для переменной. Просто нажмите левую часть объявления переменной, как при создании нормальной точки останова.

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