Разрыв, когда переменной присваивается какое-то значение

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

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

Это достижимо?

5 ответов

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

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

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

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

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

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

альтернативный текст

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

Изменить: тикет, который я связал в этом ответе, был помечен как проверенный / исправленный. Он был интегрирован в последнюю версию 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 лет на данный момент) и имеет ограниченную поддержку со стороны сообщества. TBH, я не вижу, чтобы это зашло слишком далеко, особенно без дополнительного разъяснения ожиданий, связанных с такого рода запросом функции, и без какого-либо серьезного рассмотрения проекта, поставленного за ним первым.

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

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

В контекстном меню можно выбрать " Добавить выражение наблюдения" и " Изменить выражение наблюдения".

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

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

Другие вопросы по тегам