Eclipse - не вдається встановити точку перерви через відсутні атрибути номера рядка


370

Я отримую цю дивну помилку в Eclipse під час спроби встановити точку перерви.

Unable to insert breakpoint Absent Line Number Information

Я поставив галочку від параметрів компілятора, але не пощастило.


ви можете зробити javap -verbose на файлі класу та вставити інформацію тут? Перевірте, чи має він насправді номер рядка.
z -

3
Привіт, yx, я зробив javap на цьому класі. Він генерує номери рядків
chandrajeet

Як не дивно, я щойно стикався з цією проблемою з плагіном BlackBerry, Eclipse 3.5, нічого спільного з Tomcat. І я це також зупиняюсь на точках розриву, за винятком одного з них ... якщо я знайду відповідь, я відправлю повідомлення.
Річард Ле Месюр'є

6
Для мене це був неправильний знущання, я випадково знущався над класом, який я тестував. Можливо, хтось вважає це актуальним.
hipokito

1
@hipokito Чи можете ви пояснити, що означає знущатися над класом і як його скасувати? Інші рішення для мене не працюють.
Бурштин

Відповіді:


227

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

Вікно -> Налаштування -> Java -> Компілятор -> Генерація классових файлів: " перевірено додавання атрибутів номера рядка до створеного файлу класу" . Я зробив чисту, перекомпіляцію. Я зняв його, перекомпілював, перевірив, перекомпілював. Я переконався, що проект використовував глобальні налаштування. Ще те саме повідомлення.

Я перейшов на створення мурашок, використовуючи

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

Все-таки те саме повідомлення.

Я не дізнався, що спричинило це повідомлення і чому воно не піде. Хоча, здавалося, це має щось спільне з запущеним сеансом налагодження Tomcat: при відключенні перекомпіляція вирішує проблему. Але підключення налагоджувача до Tomcat або встановлення нових точок перерви під час підключеного сеансу налагодження, воно з’явилося знову.

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


31
Сказане не працювало для мене. Мені довелося натиснути на іконку «Видалити всі точки прориву» у вікні Eclipse> Breakpoints, а потім знову додати точки прориву. Це спрацювало.
Вік Давид

3
Я закрив усі інші проекти, видалив усі точки прориву, вніс випадкову зміну файлу, очистив проект, знову ввів точку розриву. Це працювало для мене
Алі

4
Додавання debug="true"до javacзавдання antсценарію збірки спрацювало.
Джастін Скілз

Ця відповідь все ще справедлива для моєї установки Eclipse Kepler під керуванням Windows 8 64 біт із Java 7.
Magnilex

1
"виявилося, що повідомлення було невірним ..." - це має бути смішно надмірно наголошено. Навіть прочитавши це, я не зрозумів, що це ви говорите. Подумайте про те, щоб перенести всю свою відповідь донизу, а вгорі у великому жирному вікні скажіть щось на кшталт "Цілком ймовірно, що це повідомлення нічого не означає - спробуйте просто натиснути кнопку" Не турбуй мене "і подивись, чи зможеш ти ще налагодження ".
Бейн

105
  1. У меню затемнення перейдіть у вікно-> Налаштування-> Java-> Компілятор
  2. Зніміть прапорець "Додати атрибути номера рядка ..."
  3. Клацніть Застосувати -> Так
  4. Позначте прапорець "Додати атрибут номера рядка ..."
  5. Застосовуйте ще раз.
  6. Ідіть щасливою налагодженням

1
фокус не працює в моєму випадку
Юсуф Ібрагім

28

Це вирішило мою проблему:

  1. Вікно -> налаштування -> сервер -> середовища виконання
  2. Apache Tomcat -> редагувати
  3. Виберіть JDK замість JRE

3
Це виправило мою проблему (була неправильна версія jdk, вказана в ant config). Це вирішило проблему, але затемнення СТАЛИ подало мені повідомлення про помилку. Тому не забудьте насправді пройти і спробуйте налагодити свій код після внесення цих змін - не дозволяйте повідомлення про помилку відкладати вас.
Пол

Навіть ваш додаток не веб, рішення Installed JREsJDKJRE
нормально,

Я знаю правило, але тут є багато відповідей. Цей працює для мене в листопаді 2019 року. Але я також змінюю основне середовище виконання, яке вирішує проблему на 100%.
Альваргон

19

Для питань, пов’язаних з весною, вважають, що в деяких випадках він генерує класи "без номерів рядків"; наприклад, @Serviceанотований клас без інтерфейсу, додайте інтерфейс і ви зможете налагоджувати. дивіться тут для повного прикладу.

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

Служба, що знаходиться вище, матиме інтерфейс, сформований весною, викликаючи "відсутні числа номерів рядків". Додавання реального інтерфейсу вирішує проблему генерації:

public interface TestService {
    void doSomething();
}

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

1
Що означає "додати інтерфейс"? Імпортувати його у файл?
CamHart

1
Привіт, остаточне пояснення тут github.com/spring-projects/spring-ide/isissue/… та technology.first8.nl/…
Poutrathor

14

У мене є відповідь на цю проблему з боку речей BlackBerry SDK: Чомусь, незалежно від того, скільки разів я змінював параметри компілятора, фактичний базовий файл налаштувань не змінювався.

Подивіться у папку .settings свого проекту файл, який називається org.eclipse.jdt.core.prefs .

Там ви можете змінити налаштування вручну:

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

редагувати: Надалі, я помітив, що іноді я можу ігнорувати попередження, яке надає Eclipse, і воно все одно зупиниться в потрібному місці ... цікавець і курйоз ... Я кладу це у відро речей, з якими ми вчимося мати справу при роботі як розробник.


8

Це працювало для мене:

  1. Під Window --> Preferences --> Java --> Compiler --> Classfile Generation, всі варіанти повинні бути True.
  2. Зроблено debug="true"у <javac>завданні build.xml .
  3. Розгортати застосування у tomcat за допомогою війни, породженої мурахами
  4. Перебував Томкат в Debugрежимі

7

Не знаєте, чи це все-таки актуально, можливо, інший моряк знайде це корисним.

Повідомлення з'являється, коли у файлі класу зібраний прапор налагодження вимкнено.

У затемненні ви можете увімкнути його за допомогою вищезазначених параметрів,

Вікно -> Налаштування -> Java -> Компілятор -> Генерація классових файлів: "додати атрибути номера рядка до створеного файлу класу"

Але якщо у вас є файл jar, то ви отримаєте складений вихід. Немає простого способу виправити цю проблему.

Якщо у вас є доступ до джерела і використовуєте мурашник для отримання файлу jar, ви можете змінити завдання мурашки таким чином.

  <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


6

Я пробував тут майже кожне рішення і не пощастило. Ви спробували натиснути "Не кажіть мені більше"? Після цього я перезапустив свою програму і все було добре. Затемнення вдарило мою точку розриву так, ніби нічого не було.

Першопричиною для мене було Eclipse, що намагався встановити налагодження для автоматично створених проксі-об'єктів Spring CGLIB. Якщо вам не потрібно щось налагоджувати на цьому рівні, ви повинні ігнорувати проблему.


5

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

З боку Java, я вважаю, що ваше "Позначено прапорець із параметрів компілятора" посилається на це

У розділі " Window --> Preferences --> Java --> Compiler --> Classfile Generation" для всіх Class fileпараметрів генерації встановлено значення True:

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

Чи перевіряється ваш проект лише на глобальному рівні (Налаштування Windows) або на рівні конкретного проекту?

А ви впевнені, що клас відкрився (на якому ви намагаєтесь встановити точку перерви):

  • є одним із ваших джерел (а не надходить із сторонньої бібліотеки)
  • є, а .javaне .class?

Спробуйте все очистити та відновити все, перевірити можливі конфлікти з банком .


Привіт VonC, я на Eclpise Ganymede, Java 1.6 Так, у мене налаштування в усьому світі. Я намагаюся встановити його на своєму власному коді Java, написаному, так що так, у мене є файли .java & .class. І я робив джавап на тому занятті. Він генерує номери рядків
chandrajeet

@chandrajeet Якщо у вас ці налаштування встановлені в усьому світі, я вважаю, що ви перевірили, чи ваш проект не замінює їх налаштуванням конкретного проекту? Якщо ні, то єдине, що я зараз бачу, - це поставити точки прориву на .class замість .java ...
VonC

4

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

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

ПРИМІТКА. Якщо ви тільки що додали прапор налагодження та перекомпілювали, вам все одно потрібно переукласти свою програму на сервер, оскільки саме тут Eclipse налагоджує файли класу. Дуже очевидно, але легко витратити годину або близько, чухаючи голову і цікавившись, чому це не працює (повірте мені).


4

спробуйте змінити використання. jreВстановіть замість цього jreпапку JDK.


4

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

Так що все, що я робив, було

  1. У меню затемнення перейдіть у вікно-> Налаштування-> Java-> Компілятор
  2. У розділі «Відповідність JDK» я змінив рівень відповідності компілятора з 1,7 на 1,6

Тепер Eclipse більше не скаржиться на "Неможливо вставити інформацію про точку останова" Відсутня інформація про номер рядка ", і точки налагодження налагодження фактично працюють !!!


4

Якщо нічого іншого не працює, відкрийте перспективу налагодження, очистіть усі існуючі точки перерви, а потім знову встановіть їх.


3

Це детально пояснено тут:

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

Тільки для подальшого ознайомлення це відповідна частина відповіді (ігноруйте той факт, що стосується програми Spring Boot, поведінка однакова для багатьох інших випадків):

Кожного разу, коли ви встановлюєте точку розриву в Eclipse / STS, IDE намагається встановити точку розриву в VM, якщо запустити додаток. Це те, що відбувається у вашому випадку, коли ви запускаєте додаток для завантаження в режимі налагодження.

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

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

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

Коли IDE завантажує тип корпусу (сам клас контролера), він також намагається встановити точку розриву лінії і досягає успіху в цьому. Це візуалізується галочкою на маркері точки розриву.

Тому ви можете сміливо ігнорувати повідомлення про помилку, яке з’являється. Щоб уникнути появи цього повідомлення про помилку, ви можете перейти до налаштувань (Java -> Налагодження) та відключити "Попереджати, коли не вдається встановити точку розриву через відсутні атрибути номера рядка".


2

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

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

Ця точка розриву породжує питання про помилку під час кожного запуску Debug As... > JUnit Test

Щоб вирішити цю проблему, я перемістив 'Точку зламу' вгору у власне тест (всередині TaskTest.java). Після того, як виконання зупинилося, я додав точку розбиття туди, куди я його мав, спочатку (всередині Task.java).

Я все ще отримав ту саму помилку, але після натискання кнопки "ОК" точка зламу спрацювала чудово.

Сподіваюся, що хтось допомагає,

-гмале


Дякую, що поділилися цим, у мене така ж проблема. Але рішення не працювало для мене. Я новачок у Mockito, і, можливо, у мене є якась інша проблема, яка заважає моєму глузливому об’єкту насправді телефонувати. Але я все-таки вдячний, що ви опублікували цей @gmale!
Михайло Ософський

2

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

Я все робив і досі не працює. Рішенням було видалення зібраних файлів .class і цілі згенерованого файлу війни, і тепер він працює :)


2

Отримав це повідомлення за допомогою Spring AOP (схоже, що надходить із бібліотеки CGLIB). Клацання "Ігнорувати", здається, працює нормально, я все ще можу налагоджувати.


2

Я знайшов ще одну причину цього повідомлення. Я програмував Scala. Рішення було:

  1. Відкрийте Запуск -> Конфігурації налагодження
  2. На вкладці "Головне" внизу, біля кнопок "Застосувати" та "Повернути", є текст, який говорить про те, який запуск ви використовуєте, а поруч - гіперпосилання з написом "Вибрати інше". Це дивний елемент інтерфейсу, не здається діючим на перший погляд.
  3. Використовуйте посилання "Вибрати інше" та оберіть "Запуск програми Scala (новий відладчик)". Інший, схоже, не працює зі Скалою.

Тепер налагодження має працювати. Зверніть увагу, що я встановив плагін Scala IDE, ця опція може бути недоступною, якщо у вас її немає.


2

Вище речі для мене не спрацювали. Нижче рішення остаточно спрацювали. Конфігурації налагодження -> Classpath -> Записи користувача -> (Додати папку src проекту, який ви хочете налагодити.)


1

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

Я будую все, використовуючи сценарій збірки ANT. Якщо це саме ви робите, переконайтеся, що налагоджувальний прапор встановлений на кожному завданні мурашника javac. Це була моя єдина проблема - сподіваюся, це допоможе вашій проблемі!


1

У мене була така ж помилка з JBoss 7.1 .. І я зробив те саме, що і з Зефіро. Просто проігнорував помилку, і я зміг нормально розмістити точки прориву. У моєму випадку я будував мислителя мурашиного конструктора, і це моє завдання 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>

1

У мене виникло те саме питання, я витратив чимало часу на пошук рішення, але ці рішення є невикористаними, тому я самостійно вивчаю всі випадки, нарешті з’ясував проблему, що це конфлікт між версіями JDK. Нижче наведено кроки для вирішення проблеми: 1. Видаліть усі версії JDK та JRE, збережіть лише одну версію. 2. Встановіть систему JAVA_HOME і компілятор Java в Eclipse те саме. У деяких випадках помилка вище не зникне, але ми зможемо працювати на налагоджувальній моделі.


1

Одного разу я зіткнувся з такою ж помилкою, коли використовував джуніт та Мокіто, я забув додати @PrepareForTest для статичного класу.

Додавання нижче коду вирішило мою проблему.

@PrepareForTest({XXXXX.class})

Не впевнений, що це був той самий випадок.


1

Моя проблема полягала в тому, що у мене було 2 JAR, і я намагався змінити один з іншим, грунтуючись на його порядку на Java Build Path => Order & Exportвкладці Eclipse, тому що один був для налагодження, а інший - ні (JAR налагодження був першим у порядку). Коли я зробив це таким чином, мені довелося вручну долучити джерело.

Я спробував видалити JAR без налагодження та розмістити JAR-налагодження в моєму каталозі \ WEB-INF \ lib \, очищенні, будівництві тощо, і воно спрацювало. Цього разу (видаливши додане джерело), ​​воно автоматично дозволило б мені переходити по коду налагодження, не потребуючи приєднання жодного джерела вручну. Точки розриву та налагодження також спрацювали.


У випадку, якщо хтось все-таки відчуває проблеми, я також спробував усі ці конкретні рішення, згадані в інших відповідях:

  • Зніміть прапорці, застосуйте та повторно поставте прапорець Add line number attributes...
  • Редагування вручну, org.eclipse.jdt.core.prefsяк згадується в іншій відповіді: https://stackoverflow.com/a/31588700/1599699
  • Забезпечення створення JAR з увімкненою налагодженням.
  • Зміна рівня відповідності JDK з 1,6 до 1,7 (тим самим відповідає JDK, який я використовував).

Я також зробив звичайне відключення сервера (і переконавшись, що java.exe фактично закритий ...), видалив \ build \ каталоги в обох проектах, перезапустив Eclipse з параметром -clean, відтворив JAR налагодження, оновив, очищення та побудова проекту з налагодженням JAR в ньому, запуск сервера в режимі налагодження, публікація / очищення та точка точковості.


0

Я все, що перераховано вище, зробив під час компіляції / складання банок - все одно мав те саме питання.

Зрештою, зміни jvmarg, перелічені нижче під час запуску сервера, для мене нарешті спрацювали:

1) Видалено / прокоментували купу аргументів jvm, що стосуються javaagent та bootclasspath.

2) Увімкнено / непрокоментовано наступний рядок:

Потім, коли я запускаю сервер, я можу вплинути на свої точки прориву. Я підозрюю, що яаагент якимось чином заважав здатності Eclipse виявляти номери ліній.


0

Перевірте / зробіть наступне:

1) У розділі "Вікно -> Налаштування -> Java -> Компілятор -> Створення класифікованих файлів", всі параметри повинні бути правдивими:

(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 = створити

3) Якщо все-таки з'явиться вікно про помилку, поставте прапорець, щоб не відображати повідомлення про помилку.

4) Очистити та побудувати проект. Почніть налагодження.

Зазвичай вікно помилок більше не відображається, а інформація про налагодження відображається правильно.


0

Я також зіткнувся з цією проблемою. Я використовую сценарій складання мурашок. Я працюю над застарілим додатком, тому використовую jdk версії 1.4.2. Це працювало, тому я почав оглядатися. Я помітив, що під конфігурацією налагодження на вкладці JRE версія Java була встановлена ​​на 1,7. Одного разу я змінив його на 1.4, він працював.

Я сподіваюся, що це допомагає.


0

Я намагався налагодити диспетчер журналів, і мені потрібно було змінити jre на jdk, а потім вибрати цей jdk на "головній" вкладці "Java Runtime Environment" | "JRE" конфігурації налагодження тоді все було добре.


0

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

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

Підсумовуючи це, звичайно, це виглядало так, ніби анотація @ManagedBean переплутала номери рядків, незалежно від того, чи це неправильне використання примітки.


0

Переконайтеся, що проект, у якому основний клас виконання, - це той самий проект, у якому клас, у якому ви маєте точки прориву . Якщо ні, то переконайтеся, що обидва проекти знаходяться на конверті конфігурації запуску та з’являться перед будь-якими банками та папками класів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.