Eclipse - невозможно установить точку останова из-за отсутствия атрибутов номера строки

Я получаю эту странную ошибку в Eclipse, пытаясь установить точку останова.

Unable to insert breakpoint Absent Line Number Information

Я установил флажок из опций Компилятора, но не повезло.

Ответ 1

У меня было такое же сообщение об ошибке в Eclipse 3.4.1, SUN JVM1.6.0_07, подключенное к Tomcat 6.0 (работающее в режиме отладки на другой машине, Sun JVM1.6.0_16, отладочное соединение действительно работало правильно).

Окно → Настройки → Java → Компилятор → Генерация файла классов: "добавить атрибуты номера строки в сгенерированный файл класса". Я сделал чистую, перекомпилирую. Я снял его, перекомпилировал, проверил, перекомпилировал. Я убедился, что проект действительно использует глобальные настройки. Еще одно сообщение.

Я переключился на ant build, используя

<javac srcdir="./src/java" destdir="./bin" debug="true">

Тем не менее, то же сообщение.

Я не узнал, что вызвало это сообщение, и почему оно не исчезнет. Хотя это, похоже, имело какое-то отношение к запущенному сеансу отладки Tomcat: при отключении рекомпиляция решает проблему. Но при подключении отладчика к Tomcat или при установке новых точек останова во время подключенного сеанса отладки он снова появился.

Однако оказалось, что сообщение было неправильным: я действительно смог отлаживать и устанавливать точки останова как до, так и во время отладки (javap -l также отображал номера строк). Поэтому просто игнорируйте это:)

Ответ 2

  1. В меню затмения перейдите в Window-> "Настройки" → Java-> "Компилятор".
  2. Снимите флажок "Добавить атрибуты номера строки..."
  3. Нажмите Применить → Да
  4. Установите флажок "Добавить атрибут номера строки..."
  5. Применить снова.
  6. Счастливой отладки

Ответ 3

Это устранило мою проблему:

  • Окно → настройки → сервер → среды выполнения
  • Apache Tomcat → edit
  • Выберите JDK вместо JRE

Ответ 4

Для Spring связанных вопросов следует учитывать, что в некоторых случаях он генерирует классы "без номеров строк"; например, @Service аннотированный класс без интерфейса, добавьте интерфейс, и вы можете отлаживать. см. здесь для полного примера.

@Service("SkillService")
public class TestServiceWithoutInterface {
   public void doSomething() {
      System.out.println("Hello TestServiceWithoutInterface");
   }
}

В приведенной выше службе будет создан интерфейс, созданный spring, вызывающий "недостающие номера строк". Добавление реального интерфейса решает проблему генерации:

public interface TestService {
    void doSomething();
}

@Service("SkillService")
public class TestServiceImpl implements TestService {
   public void doSomething() {
      System.out.println("Hello TestServiceImpl");
   }
}

Ответ 5

У меня есть ответ на эту проблему со стороны BlackBerry SDK: по какой-то причине, независимо от того, сколько раз я менял параметры в компиляторе, фактический основной файл настроек не изменялся.

Загляните в папку .settings вашего проекта для файла с именем org.eclipse.jdt.core.prefs.

Здесь вы можете изменить настройки вручную:

org.eclipse.jdt.core.compiler.debug.lineNumber=generate

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

Ответ 6

Это сработало для меня:

  • В Window --> Preferences --> Java --> Compiler --> Classfile Generation все параметры должны быть True.
  • Сделано debug="true" в задаче build.xml <javac>.
  • Разверните приложение в tomcat войной, созданной ant
  • Перезапуск Tomcat в режиме Debug

Ответ 7

Не знаю, насколько это актуально, может быть, другой матрос найдет это полезным.

Появляется сообщение, когда файл класса скомпилирован, и флаги отладки отключены.

В eclipse вы можете включить его по указанным выше опциям,

Окно → Настройки → Java → Компилятор → Генерация Classfile: "добавить атрибуты номера строки в сгенерированный файл класса"

Но если у вас есть файл jar, то вы получите скомпилированный вывод. Нет простого способа устранить эту проблему.

Если у вас есть доступ к источнику и используйте ant для получения файла jar, вы можете изменить задачу ant следующим образом.

  <javac  destdir="${build.destDir}" srcdir="${build.srcDir}" source="1.6" fork="true" target="${javac.target}" debug="on" debuglevel="lines,vars,source" deprecation="on" memoryInitialSize="512m" memoryMaximumSize="1024m" optimize="true"   >

Счастливая отладка..

исх: http://doc.sumy.ua/prog/Java/javanut/ch16_04.htm

Ответ 8

Было бы полезно, если бы вы указали версию затмения, которую вы используете, и технологию (например, Java JDT, AJDT для Aspect Java или C++ CDT), просто чтобы быть уверенным.

На стороне Java, я полагаю, что ваш "галочка в опциях компилятора" относится к этому

В разделе " Window --> Preferences --> Java --> Compiler --> Classfile Generation Class file " для всех Window --> Preferences --> Java --> Compiler --> Classfile Generation " Class file " установлено значение True:

  • (1) добавить переменные атрибуты,
  • (2) номера addline,
  • (3) добавить имя исходного файла,
  • (4) сохранить неиспользованные локальные переменные.

Ваш проект проверен только на глобальном уровне (настройки Windows) или на уровне проекта?

И уверены ли вы, что класс открыт (на котором вы пытаетесь установить точку останова):

  • является одним из ваших источников (а не из сторонней библиотеки)
  • такое .java, а не .class?

Попытайтесь очистить все и восстановить все, проверьте на возможные конфликты фляги.

Ответ 9

У меня была эта проблема при попытке запустить Tomcat в режиме отладки из Eclipse. У меня был файл сборки ANT, который заботился о компиляции и развертывании. После установки флага отладки в true (как упоминалось в других ответах) и повторного развертывания приложения он работал нормально:

<javac srcdir="./src/java" destdir="./bin" debug="true">

ПРИМЕЧАНИЕ:, если вы только что добавили флаг отладки и перекомпилировали, вам все равно нужно перераспределить ваше приложение на сервер, так как именно там Eclipse отлаживает файлы классов, Очень очевидно, но легко потратить час или около того, царапая голову и задаваясь вопросом, почему она не работает (поверьте мне).

Ответ 10

попробуйте изменить jre, который вы используете. Вместо этого установите jre в папку JDK.

Ответ 11

Поскольку у меня есть 6 различных версий Java, мне пришлось изменить соответствие JDK по умолчанию, чтобы соответствовать требованиям Java-версии, которую я хотел использовать. Eclipse по умолчанию имел уровень соответствия компилятора, установленный на Java 1.7, когда все было построено/скомпилировано с использованием Java 1.6.

Итак, все, что я сделал, было

  • В меню eclipse перейдите в Window- > Preferences- > Java- > Compiler
  • В соответствии с JDK Compliance я изменил уровень соответствия компилятора с 1.7 до 1.6

Теперь Eclipse не жалуется на "Невозможно вставить информацию о точке отсутствия точки останова", и на самом деле работают контрольные точки отладки.

Ответ 12

Если ничего не работает, откройте перспективу отладки, очистите все существующие точки останова и затем установите их снова.

Ответ 13

Я попробовал почти все решения здесь и не повезло. Вы попробовали нажать "Не рассказывать мне снова"?. После этого я перезапустил свою программу, и все было хорошо. Eclipse ударил точку останова, как будто ничего не случилось.

Основная причина для меня заключалась в том, что Eclipse пыталась настроить отладку для автоматически генерируемых прокси-объектов Spring CGLIB. Если вам не нужно отлаживать что-то на этом уровне, вы должны игнорировать проблему.

Ответ 14

Моя ситуация была похожа:

  • Я отлаживал тест JUnit
  • Я использовал Mockito для создания шпиона, как в spyTask = spy(new Task())
  • Я поставил точку останова внутри класса, которую я шпионил (внутри Task.java)

Эта точка останова генерирует ошибку, о которой идет речь, каждый раз, когда я запускаю Debug As... > JUnit Test

Чтобы устранить проблему, я переместил точку останова "вверх" в фактический тест (внутри TaskTest.java). Когда выполнение остановлено, я добавил точку останова, где у меня это было, изначально (внутри Task.java).

Я по-прежнему получал ту же ошибку, но после нажатия "ok" точка останова работала нормально.

Надеюсь, что кто-то поможет,

-gmale

Ответ 15

У меня была такая же проблема, когда я делал на причальном сервере и компилировал новый .war файл ANT. Вы должны сделать такую ​​же версию компилятора jdk/jre и пути сборки (например, jdk 1.6v33, jdk 1.7,....) после того, как вы должны установить Java Compiler, как было написано ранее.

Я сделал все и все еще не работал. Решение было удалено скомпилированные файлы .class и цель сгенерированного файла войны, а теперь его рабочая:)

Ответ 16

Получено это сообщение с помощью Spring AOP (похоже, из библиотеки CGLIB). Нажатие "Игнорировать", похоже, работает нормально, я все еще могу отлаживать.

Ответ 17

Я нашел еще одну причину этого сообщения. Я программировал Scala. Решение было:

  • Open Run → Конфигурации отладки
  • На вкладке "Главная" внизу внизу рядом с кнопками "Применить" и "Отменить" появляется текст, в котором вы используете Launcher, а рядом с ним есть гиперссылка "Выбрать другую". Это странный элемент пользовательского интерфейса, который на первый взгляд не выглядит действенным.
  • Используйте ссылку "Выбрать другую" и выберите "Scala Приложение (новый отладчик) Launcher". Другой, похоже, не работает с Scala.

Теперь отладка должна работать. Обратите внимание, что я установил плагин Scala IDE, этот параметр может быть недоступен, если у вас его нет.

Ответ 18

У меня была эта же проблема при отладке WAR (построенной из нескольких артефактов проекта Eclipse), развернутых в Tomcat.

Я создаю все, используя ANT build script. Если это то, что вы делаете, убедитесь, что флаг debug = true установлен в каждой задаче javac ANT, которую вы получили. Это была моя единственная проблема - я надеюсь, что это поможет вашей проблеме!

Ответ 19

У меня была такая же ошибка с JBoss 7.1.. И я сделал то же самое, что и Зефиро. Просто проигнорировал ошибку, и я смог разместить точки останова в обычном режиме. В моем случае я строил мыслительный конструктор ant, и это моя задача javac:

<javac
        srcdir="${src.dir}"
        destdir="${build.classes.dir}" 
        includeantruntime="false" 
        debug="${debug}"
        verbose="false"
        debuglevel="lines,vars,source"
        source="1.6"
        target="1.6">

        <!-- Sppressing warning for setting an older source without bootclasspath
             (see: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source) -->
        <compilerarg value="-Xlint:-options"/>

        <classpath>
            <fileset dir="${lib.dir}" includes="*.jar" />
            <fileset dir="${jboss.lib.dir}" includes="**/*.jar" />
        </classpath>

    </javac>

Ответ 20

У меня такая же проблема, я потратил много времени на поиск решения, но эти решения не полезны, поэтому я сам изучаю все случаи, наконец, я обнаружил, что проблема связана с версиями JDK. Ниже приведены шаги для решения проблемы: 1. Удалите все версии JDK и JRE, сохраните только одну версию. 2. Установить JAVA_HOME и java-компилятор в Eclipse - это то же самое. В некоторых случаях ошибка выше не исчезнет, ​​но мы сможем работать в модели отладки.

Ответ 21

Как только я испытал ту же ошибку, когда использовал junit и Mockito, я забыл добавить @PrepareForTest для статического класса.

Добавить ниже код исправил мою проблему.

@PrepareForTest({XXXXX.class})

Не уверен, что это был тот же случай.

Ответ 22

Это подробно объясняется здесь:

https://github.com/spring-projects/spring-ide/issues/78

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

Всякий раз, когда вы устанавливаете точку останова в Eclipse/STS, среда IDE пытается установить точку останова в виртуальной машине, если вы запустите приложение. Это то, что происходит в вашем случае, когда вы запускаете загрузочное приложение в режиме отладки.

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

Это решение (установить точку останова в заданном загруженном классе или нет) проверяет типы, на которые вы устанавливали точку останова, охватывая типы и внутренние классы. Это гарантирует, что точки останова для внутренних классов (даже анонимных внутренних классов) устанавливаются в JVM (и не игнорируются).

Spring Boot создает внутренний класс для вашего контроллера во время выполнения (это внутренний класс CGLIB, который появляется в сообщении об ошибке). Когда JVM загружает этот класс, он пытается установить точку останова номера строки для закрывающего типа (для этого внутреннего класса). Так как сгенерированный внутренний класс не имеет информации о номере линии (ему не нужно иметь информацию о номере линии), установка точки останова не выполняется для этого внутреннего класса с указанным сообщением об ошибке.

Когда среда IDE загружает закрытый тип (сам класс контроллера), он также пытается установить точку останова линии и успешно с этим. Это визуализируется с помощью маркера проверки на марке точки останова.

Поэтому вы можете спокойно проигнорировать появившееся сообщение об ошибке. Чтобы избежать появления этого сообщения об ошибке, вы можете перейти к настройкам (Java → Debug) и отключить "Предупреждать, когда не удается установить точку останова из-за отсутствия атрибутов номера строки".

Ответ 23

Я сделал все, что указано выше, при компиляции/создании фляг - все равно была проблема.

В конце концов, изменения jvmarg, перечисленные ниже при запуске сервера, - это то, что, наконец, помогло мне:

1) Удалено/Комментировано множество аргументов jvm, относящихся к javaagent и bootclasspath.

     

2) Включил/не прокомментировал следующую строку:

Затем, когда я запускаю сервер, я могу ударить по своим точкам останова. Я подозреваю, что javaagent каким-то образом вмешивался в способность Eclipse обнаруживать номера строк.

Ответ 24

Проверьте/выполните следующие действия:

1) В разделе "Окно → Настройки → Java → Компилятор → Генерация файлов классов" все параметры должны быть в True:

(1) Add variable attributes...
(2) Add line number attributes...
(3) Add source file name...
(4) Preserve unused (never read) local variables

2) В папке .settings вашего проекта найдите файл org.eclipse.jdt.core.prefs. Проверьте или установите org.eclipse.jdt.core.compiler.debug.lineNumber = generate

3) Если окно ошибки все еще отображается, установите флажок, чтобы не отображать сообщение об ошибке.

4) Очистите и создайте проект. Начать отладку.

Обычно окно ошибки больше не отображается, и информация об отладке отображается правильно.

Ответ 25

Я столкнулся с этой проблемой. Я использую ant build script. Я работаю над старым приложением, поэтому я использую jdk версии 1.4.2. Это работало, поэтому я начал озираться. Я заметил, что в конфигурации Debug на вкладке JRE версия Java была установлена ​​в 1.7. Как только я изменил его на 1.4, он сработал.

Надеюсь, это поможет.

Ответ 26

Я пытался отлаживать диспетчер протоколирования и должен был изменить jre на jdk, а затем выбрать этот jdk на вкладке "main", "Java Runtime Environment" | "runtime JRE" конфигурации отладки, тогда все было хорошо.

Ответ 27

Я видел эту проблему, когда я аннотировал класс с @ManagedBean (javax.annotation.ManagedBean). Предупреждающее сообщение появилось при запуске нового приложения JBoss EAP 6.2.0. Игнорирование и запуск в любом случае не помогли - точка останова не была достигнута.

Я называл это bean использованием EL на странице JSF. Теперь... возможно, что @ManagedBean не годится для этого (я новичок в CDI). Когда я изменил свою аннотацию на @Model, мой bean выполнил, но предупреждение точки останова также ушло, и я ударил точку останова, как ожидалось.

В целом, это выглядело так, как будто аннотация @ManagedBean испортила номера строк, независимо от того, использовалась ли она неправильной аннотации.

Ответ 28

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

Ответ 29

У меня была такая же проблема с одним конкретным проектом, и я продолжал пытаться reset атрибуты номера строки в Window- > Preferences... Тогда я понял, что у каждого проекта есть собственные настройки для атрибутов номера строки. Щелкните правой кнопкой мыши проект, перейдите в свойства, выберите JavaCompiler и установите флажок "Добавить атрибуты номера строки..."

Ответ 30

Если вышеуказанное решение не работает, и вы начали получать эту проблему после того, как сделали инъекцию spring bean, проблема может заключаться в том, что вы не использовали интерфейс для введенного класса. Попробуйте сделать инъекцию с классом, который реализует интерфейс, решит проблему. Для примера следуйте ссылке: Не удается установить проблему контрольной точки для создания bean