Разрыв, когда переменной присваивается какое-то значение - PullRequest
36 голосов
/ 17 февраля 2010

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

Например, разрывать каждый раз, когда x == ноль.

Достижимо ли это?

Ответы [ 5 ]

32 голосов
/ 20 февраля 2010

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

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

  1. Откройте перспективу отладчика и выберите вкладку 'BreakPoints'

  2. Добавить новую точку останова в файле кода - в соответствующем месте, где вы хотели бы наблюдать за выполнением программы

  3. Затем вернитесь на вкладку «Точки останова» , щелкните правой кнопкой мыши вновь добавленную запись и выберите «Свойства точки останова»

  4. Установите условие, при котором он должен быть активирован

alt text

9 голосов
/ 01 мая 2013

Редактировать : Билет, который я связал в этом ответе был помечен как проверенный / исправленный. Он был интегрирован в последнюю версию Oxygen, , как описано в примечаниях к выпуску . Ниже я оставлю свой первоначальный ответ, поскольку в нем содержится много полезной информации о том, как JDI и JDT работают вместе в Eclipse.


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

Eclipse использует JDI (в самом низу этой страницы) для регистрации точек наблюдения в JVM. Это делается с помощью методов EventRequestManager (реализация обеспечивается самой JVM, а не Eclipse), которые создают точки наблюдения, то есть EventRequstManager.createModificationWatchpointRequest. Единственное, что принимают эти методы, это Field (обратите внимание, что это не класс Field). Короче говоря, Eclipse не может сделать это напрямую через Java. Не бойтесь, Java также не обрабатывает условные точки останова. Они также реализуются через Eclipse напрямую, вместо того, чтобы полагаться на Java. Однако есть некоторые предупреждения, которые делают условные контрольные точки гораздо более сложными для реализации, чем условные контрольные точки.

Давайте рассмотрим простые, условные точки останова. Чтобы они работали, вам нужен контекст, в котором вы можете выполнить фрагмент кода. Без контекста выполнения для кода мы не сможем оценить выражение / операторы во фрагменте, так как у нас нет способа разрешения переменных, значений, типов и т. Д. Это делается с помощью анализатора AST , который обрабатывает код Java в реальных инструкциях. Помните, что в условие можно ввести несколько операторов, а не одно выражение. Затем оценщик использует контекст (в частности, IJavaStackFrame) для оценки самого выражения после его синтаксического анализа.

Теперь подумайте об условной точке наблюдения, потому что эта последняя точка очень важна. Что такое контекст выполнения точки наблюдения? Доступ к переменным может происходить не только в пределах одного и того же класса, но и в других классах (например, protected и членах пакета), а также во внутренних классах (через MyClass.this.myField). Это означает, что:

  1. локальные переменные никогда не бывают согласованными, поскольку доступ к полю можно получить несколькими способами,
  2. переменные-члены класса, из которого вызывается доступ, никогда не являются непротиворечивыми, поскольку к полю можно получить доступ из нескольких классов,
  3. импортированные классы, доступные в контексте выполнения, никогда не согласуются по той же причине, что и (2), и
  4. доступ к самому полю никогда не бывает согласованным, поскольку для этого может потребоваться квалификация с экземпляром, именем класса, super или с чем-то вроде MyClass.this.myField (для доступа к внутреннему классу).

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

myField всегда совпадает с this.myField или super.myField или MyClass.myField или MyClass.this.myField, в зависимости от того, где осуществляется доступ к полю.

Это немного усложняет ситуацию, особенно в системе, которая уже является относительно сложной. Пример кода условной точки останова можно найти здесь (поиск по getEvaluationEngine с помощью Ctrl + F). Теперь возьмите это и добавьте предварительную обработку выражения, основанного на наборе правил о том, где мы находимся и где находится поле, и выполнение каких-либо действий может стать сложным.

AFAIK, вы не можете сделать что-то вроде: «если старое / новое значение - это, приостановить», потому что эта информация просто недоступна из информации, которую вы можете получить в кадре стека (и, следовательно, из отладчика ). Выражение, присваиваемое значению, было оценено по времени попадания в точку наблюдения, но его результат недоступен отладчику, поэтому он не доступен для оценщика на самой точке наблюдения. Сначала должен быть выполнен шаг для выполнения присваивания, затем выражение должно быть оценено после шага. Это было бы ужасно грязно и, честно говоря, довольно глупо.

В любом случае, если вы хотите заявить о своей поддержке этой функции, вы можете использовать этот билет Eclipse . Тем не менее, он существует с 2005 года (8 лет на данный момент) и имеет ограниченную поддержку со стороны сообщества. ТБХ, я не вижу, чтобы это зашло слишком далеко, особенно без дополнительного разъяснения ожиданий, связанных с такого рода запросом функции, и без каких-либо серьезных конструктивных соображений, поставленных вначале.

9 голосов
/ 29 апреля 2013

Вы можете довольно близко подойти к Точкам модификации поля . Они ограничены размещением в полях объектов (не локальных переменных, параметров или выражений), и они запускаются всякий раз, когда в поле записывается, но Eclipse ближе всего к тому, что вы хотите.

5 голосов
/ 17 февраля 2010

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

В зависимости от версий и тому подобного, вы выбираете переменную в представлении Outline и щелкаете по ней правой кнопкой мыши или в представлении Variables, управляете / щелкаете по ней.

В контекстном меню можно выбрать Добавить выражение просмотра и Редактировать выражение просмотра .

0 голосов
/ 29 апреля 2013

Извините, но в Eclipse нет способа делать то, что вы хотите. То, что вам нужно, это точки наблюдения с условным выражением точки останова. Он не существует в Eclipse.

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

...