Eclipse и другой Java IDE для отладки параллельного кода

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

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

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

7
задан Justin Ethier 13 July 2010 в 19:32
поделиться

2 ответа

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

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

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

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

4
ответ дан 6 December 2019 в 15:18
поделиться

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

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

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

1
ответ дан 6 December 2019 в 15:18
поделиться