Я получаю эту странную ошибку в Eclipse, пытаясь установить точку останова.
Unable to insert breakpoint Absent Line Number Information
Я установил флажок из опций Компилятора, но не повезло.
Я получаю эту странную ошибку в Eclipse, пытаясь установить точку останова.
Unable to insert breakpoint Absent Line Number Information
Я установил флажок из опций Компилятора, но не повезло.
У меня было такое же сообщение об ошибке в 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 также отображал номера строк). Поэтому просто игнорируйте это:)
Это устранило мою проблему:
Для 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");
}
}
У меня есть ответ на эту проблему со стороны BlackBerry SDK: по какой-то причине, независимо от того, сколько раз я менял параметры в компиляторе, фактический основной файл настроек не изменялся.
Загляните в папку .settings вашего проекта для файла с именем org.eclipse.jdt.core.prefs.
Здесь вы можете изменить настройки вручную:
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
edit: В дополнение к этому, я заметил, что иногда я могу игнорировать предупреждение, которое дает Eclipse, и он все равно остановится в нужном месте... любопытство и любопытство... Я помещаю это в ведро вещей, которые мы изучаем для работы при работе в качестве разработчика.
Это сработало для меня:
Window --> Preferences --> Java --> Compiler --> Classfile Generation
все параметры должны быть True
.debug="true"
в задаче build.xml <javac>
.Debug
Не знаю, насколько это актуально, может быть, другой матрос найдет это полезным.
Появляется сообщение, когда файл класса скомпилирован, и флаги отладки отключены.
В 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" >
Счастливая отладка..
Было бы полезно, если бы вы указали версию затмения, которую вы используете, и технологию (например, 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:
Ваш проект проверен только на глобальном уровне (настройки Windows) или на уровне проекта?
И уверены ли вы, что класс открыт (на котором вы пытаетесь установить точку останова):
.java
, а не .class
?Попытайтесь очистить все и восстановить все, проверьте на возможные конфликты фляги.
У меня была эта проблема при попытке запустить Tomcat в режиме отладки из Eclipse. У меня был файл сборки ANT, который заботился о компиляции и развертывании. После установки флага отладки в true (как упоминалось в других ответах) и повторного развертывания приложения он работал нормально:
<javac srcdir="./src/java" destdir="./bin" debug="true">
ПРИМЕЧАНИЕ:, если вы только что добавили флаг отладки и перекомпилировали, вам все равно нужно перераспределить ваше приложение на сервер, так как именно там Eclipse отлаживает файлы классов, Очень очевидно, но легко потратить час или около того, царапая голову и задаваясь вопросом, почему она не работает (поверьте мне).
попробуйте изменить jre
, который вы используете. Вместо этого установите jre
в папку JDK
.
Поскольку у меня есть 6 различных версий Java, мне пришлось изменить соответствие JDK по умолчанию, чтобы соответствовать требованиям Java-версии, которую я хотел использовать. Eclipse по умолчанию имел уровень соответствия компилятора, установленный на Java 1.7, когда все было построено/скомпилировано с использованием Java 1.6.
Итак, все, что я сделал, было
Теперь Eclipse не жалуется на "Невозможно вставить информацию о точке отсутствия точки останова", и на самом деле работают контрольные точки отладки.
Если ничего не работает, откройте перспективу отладки, очистите все существующие точки останова и затем установите их снова.
Я попробовал почти все решения здесь и не повезло. Вы попробовали нажать "Не рассказывать мне снова"?. После этого я перезапустил свою программу, и все было хорошо. Eclipse ударил точку останова, как будто ничего не случилось.
Основная причина для меня заключалась в том, что Eclipse пыталась настроить отладку для автоматически генерируемых прокси-объектов Spring CGLIB. Если вам не нужно отлаживать что-то на этом уровне, вы должны игнорировать проблему.
Моя ситуация была похожа:
spyTask = spy(new Task())
Task.java
)Эта точка останова генерирует ошибку, о которой идет речь, каждый раз, когда я запускаю Debug As... > JUnit Test
Чтобы устранить проблему, я переместил точку останова "вверх" в фактический тест (внутри TaskTest.java). Когда выполнение остановлено, я добавил точку останова, где у меня это было, изначально (внутри Task.java).
Я по-прежнему получал ту же ошибку, но после нажатия "ok" точка останова работала нормально.
Надеюсь, что кто-то поможет,
-gmale
У меня была такая же проблема, когда я делал на причальном сервере и компилировал новый .war файл ANT. Вы должны сделать такую же версию компилятора jdk/jre и пути сборки (например, jdk 1.6v33, jdk 1.7,....) после того, как вы должны установить Java Compiler, как было написано ранее.
Я сделал все и все еще не работал. Решение было удалено скомпилированные файлы .class и цель сгенерированного файла войны, а теперь его рабочая:)
Получено это сообщение с помощью Spring AOP (похоже, из библиотеки CGLIB). Нажатие "Игнорировать", похоже, работает нормально, я все еще могу отлаживать.
Я нашел еще одну причину этого сообщения. Я программировал Scala. Решение было:
Теперь отладка должна работать. Обратите внимание, что я установил плагин Scala IDE, этот параметр может быть недоступен, если у вас его нет.
У меня была эта же проблема при отладке WAR (построенной из нескольких артефактов проекта Eclipse), развернутых в Tomcat.
Я создаю все, используя ANT build script. Если это то, что вы делаете, убедитесь, что флаг debug = true установлен в каждой задаче javac ANT, которую вы получили. Это была моя единственная проблема - я надеюсь, что это поможет вашей проблеме!
У меня была такая же ошибка с 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>
У меня такая же проблема, я потратил много времени на поиск решения, но эти решения не полезны, поэтому я сам изучаю все случаи, наконец, я обнаружил, что проблема связана с версиями JDK. Ниже приведены шаги для решения проблемы: 1. Удалите все версии JDK и JRE, сохраните только одну версию. 2. Установить JAVA_HOME и java-компилятор в Eclipse - это то же самое. В некоторых случаях ошибка выше не исчезнет, но мы сможем работать в модели отладки.
Как только я испытал ту же ошибку, когда использовал junit и Mockito, я забыл добавить @PrepareForTest
для статического класса.
Добавить ниже код исправил мою проблему.
@PrepareForTest({XXXXX.class})
Не уверен, что это был тот же случай.
Это подробно объясняется здесь:
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) и отключить "Предупреждать, когда не удается установить точку останова из-за отсутствия атрибутов номера строки".
Я сделал все, что указано выше, при компиляции/создании фляг - все равно была проблема.
В конце концов, изменения jvmarg, перечисленные ниже при запуске сервера, - это то, что, наконец, помогло мне:
1) Удалено/Комментировано множество аргументов jvm, относящихся к javaagent и bootclasspath.
2) Включил/не прокомментировал следующую строку:
Затем, когда я запускаю сервер, я могу ударить по своим точкам останова. Я подозреваю, что javaagent каким-то образом вмешивался в способность Eclipse обнаруживать номера строк.
Проверьте/выполните следующие действия:
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) Очистите и создайте проект. Начать отладку.
Обычно окно ошибки больше не отображается, и информация об отладке отображается правильно.
Я столкнулся с этой проблемой. Я использую ant build script. Я работаю над старым приложением, поэтому я использую jdk версии 1.4.2. Это работало, поэтому я начал озираться. Я заметил, что в конфигурации Debug на вкладке JRE версия Java была установлена в 1.7. Как только я изменил его на 1.4, он сработал.
Надеюсь, это поможет.
Я пытался отлаживать диспетчер протоколирования и должен был изменить jre на jdk, а затем выбрать этот jdk на вкладке "main", "Java Runtime Environment" | "runtime JRE" конфигурации отладки, тогда все было хорошо.
Я видел эту проблему, когда я аннотировал класс с @ManagedBean (javax.annotation.ManagedBean). Предупреждающее сообщение появилось при запуске нового приложения JBoss EAP 6.2.0. Игнорирование и запуск в любом случае не помогли - точка останова не была достигнута.
Я называл это bean использованием EL на странице JSF. Теперь... возможно, что @ManagedBean не годится для этого (я новичок в CDI). Когда я изменил свою аннотацию на @Model, мой bean выполнил, но предупреждение точки останова также ушло, и я ударил точку останова, как ожидалось.
В целом, это выглядело так, как будто аннотация @ManagedBean испортила номера строк, независимо от того, использовалась ли она неправильной аннотации.
Убедитесь, что проект, в котором находится основной класс среды выполнения, - это тот же проект, в котором класс, на котором у вас есть точки останова в. Если нет, убедитесь, что оба проекта находятся в пути к классам конфигурации запуска и отображаются перед любыми банками и папками классов.
У меня была такая же проблема с одним конкретным проектом, и я продолжал пытаться reset атрибуты номера строки в Window- > Preferences... Тогда я понял, что у каждого проекта есть собственные настройки для атрибутов номера строки. Щелкните правой кнопкой мыши проект, перейдите в свойства, выберите JavaCompiler и установите флажок "Добавить атрибуты номера строки..."
Если вышеуказанное решение не работает, и вы начали получать эту проблему после того, как сделали инъекцию spring bean, проблема может заключаться в том, что вы не использовали интерфейс для введенного класса. Попробуйте сделать инъекцию с классом, который реализует интерфейс, решит проблему. Для примера следуйте ссылке: Не удается установить проблему контрольной точки для создания bean