Eclipse: no se puede instalar el punto de interrupción debido a la falta de atributos de número de línea

370

Recibo este extraño error en Eclipse al intentar establecer un punto de interrupción.

Unable to insert breakpoint Absent Line Number Information

Marqué la casilla de verificación de las opciones del compilador pero no tuve suerte.

chandrajeet
fuente
¿Puedes hacer un javap -verbose en el archivo de clase y pegar la información aquí? Vea si realmente tiene un número de línea.
z -
3
Hola yx, hice un javap en esa clase. Genera los números de línea
Chandrajeet 05 de
Curiosamente, acabo de encontrar este problema con el complemento de BlackBerry, Eclipse 3.5, nada que ver con Tomcat. Y yo también se detiene en puntos de interrupción, excepto uno de ellos ... si encuentro una respuesta, publicaré.
Richard Le Mesurier
66
Para mí fue un simulacro equivocado, accidentalmente me burlé de la clase que estaba probando. Quizás alguien encuentre esto relevante.
hipokito
1
@hipokito ¿Puedes explicar qué significa burlarse de una clase y cómo deshacerla? Las otras soluciones no me funcionan.
Ámbar

Respuestas:

227

Recibí el mismo mensaje de error en Eclipse 3.4.1, SUN JVM1.6.0_07 conectado a Tomcat 6.0 (ejecutándose en modo de depuración en una máquina diferente, Sun JVM1.6.0_16, la conexión de depuración funcionó correctamente).

Ventana -> Preferencias -> Java -> Compilador -> Generación de archivos de clase: se verificó "agregar atributos de número de línea al archivo de clase generado" . Hice una limpieza, recompilar. Lo desmarqué, volví a compilar, verifiqué, volví a compilar. Me aseguré de que el proyecto usara la configuración global. Sigue siendo el mismo mensaje.

Cambié a Ant Build, usando

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

Aún así, el mismo mensaje.

No descubrí qué causó este mensaje y por qué no desaparecería. Aunque parecía tener algo que ver con la sesión de depuración de Tomcat en ejecución: cuando se desconecta, la recompilación resuelve el problema. Pero al conectar el depurador a Tomcat o al establecer nuevos puntos de interrupción durante una sesión de depuración conectada, apareció nuevamente.

Sin embargo, resultó que el mensaje era incorrecto : pude depurar y establecer puntos de interrupción, tanto antes como durante la depuración ( javap -l también mostró números de línea). Así que ignóralo :)

Zefiro
fuente
31
Lo anterior no funcionó para mí. Tuve que hacer clic en el icono 'Eliminar todos los puntos de interrupción' en la vista Eclipse> Puntos de interrupción, luego volver a agregar los puntos de interrupción. Eso funciono.
Vik David
3
Cerré todos los demás proyectos, eliminé todos los puntos de interrupción, hice un cambio aleatorio en el archivo, limpié el proyecto, introduje el punto de ruptura nuevamente. Eso funcionó para mí
Ali
44
Agregar debug="true"a la javactarea del antscript de construcción funcionó.
Justin Skiles
Esta respuesta sigue siendo válida para mi instalación de Eclipse Kepler que se ejecuta en Windows 8 de 64 bits con Java 7.
Magnilex
1
"Resultó que el mensaje estaba equivocado ..." - esto debería ser ridículamente sobre enfatizado. Incluso después de leer eso, no entendí qué es lo que estabas diciendo. Considere mover su respuesta completa al final y en la parte superior en un cuadro grande en negrita, diga algo como "Es probable que este mensaje no signifique nada; intente simplemente hacer clic en el botón No molestarme y vea si puede todavía depurar ".
Bane
105
  1. En el menú de eclipse, vaya a Ventana-> Preferencias-> Java-> Compilador
  2. Desmarque la casilla de verificación "Agregar atributos de número de línea ..."
  3. Haga clic en Aplicar -> Sí
  4. Marque la casilla de verificación "Agregar atributo de número de línea ..."
  5. Aplicar de nuevo.
  6. Ve feliz depurando
Paolo Forgia
fuente
1
el truco no funciona en mi caso
Yusuf Ibrahim
28

Esto solucionó mi problema:

  1. Ventana -> preferencias -> servidor -> entornos de tiempo de ejecución
  2. Apache Tomcat -> editar
  3. Seleccione un JDK en lugar de JRE
usuario584572
fuente
3
Esto solucionó mi problema (tenía la versión incorrecta de jdk especificada en la configuración de ant). Solucionó el problema, pero eclipse TODAVÍA me dio el mensaje de error. Así que asegúrese de revisar e intentar depurar su código después de realizar este cambio; no permita que el mensaje de error lo desanime.
Paul
Incluso su aplicación no es web, la solución está bien, por Installed JREsdefecto es en JDKlugar deJRE
ahmednabil88
Conozco la regla, pero hay muchas respuestas aquí. Este, funciona para mí en noviembre de 2019, pero también cambio el entorno principal de Runtime, que resuelve el problema al 100%.
Alvargon
19

Para problemas relacionados con Spring , considere que en algunos casos genera clases "sin números de línea"; por ejemplo, una @Serviceclase anotada sin una interfaz, agregue la interfaz y puede depurarla. ver aquí para un ejemplo completo.

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

El servicio anterior tendrá una interfaz generada por resorte que causa "números de línea faltantes". Agregar una interfaz real resuelve el problema de generación:

public interface TestService {
    void doSomething();
}

@Service("SkillService")
public class TestServiceImpl implements TestService {
   public void doSomething() {
      System.out.println("Hello TestServiceImpl");
   }
}
Paizo
fuente
1
¿Qué significa "agregar la interfaz"? ¿Importarlo al archivo?
CamHart
1
Hola, la explicación definitiva aquí github.com/spring-projects/spring-ide/issues/… and technology.first8.nl/…
Poutrathor
14

Tengo la respuesta a este problema desde el lado del SDK de BlackBerry: por alguna razón, no importa cuántas veces haya cambiado las opciones en el compilador, el archivo de configuración subyacente real no cambió.

Busque en la carpeta .settings de su proyecto un archivo llamado org.eclipse.jdt.core.prefs .

Allí puede modificar la configuración manualmente:

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

editar: Además de esto, he notado que a veces puedo ignorar la alerta que Eclipse da, y aún se detendrá en el lugar requerido ... curioser y curioser ... Puse esto en el cubo de cosas con las que aprendemos a lidiar cuando trabajas como dev.

Richard Le Mesurier
fuente
8

Esto funcionó para mí:

  1. Debajo Window --> Preferences --> Java --> Compiler --> Classfile Generation, todas las opciones tienen que ser True.
  2. Hecho debug="true"en la <javac>tarea build.xml .
  3. Implementar la aplicación en el tomcat por la guerra generada por ant
  4. Reinició el Tomcat en Debugmodo
Binu N Kavumkal
fuente
7

No sé si esto sigue siendo relevante, quizás otro marinero lo encuentre útil.

El mensaje aparece cuando uno tiene un archivo de clase compilado, las banderas de depuración desactivadas.

En eclipse, puede activarlo mediante las opciones mencionadas anteriormente,

Ventana -> Preferencias -> Java -> Compilador -> Generación de archivos de clase: "agregar atributos de número de línea al archivo de clase generado"

Pero si tiene un archivo jar, obtendrá el resultado compilado. No hay una manera fácil de solucionar este problema.

Si tiene acceso a la fuente y usa ant para obtener el archivo jar, puede modificar la tarea ant de la siguiente manera.

  <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"   >

Feliz depuración ..

ref: http://doc.sumy.ua/prog/Java/javanut/ch16_04.htm

jayaram S
fuente
6

Probé casi todas las soluciones aquí y no tuve suerte. ¿Intentaste hacer clic en "No me digas otra vez"? Después de hacerlo, reinicié mi programa y todo estuvo bien. Eclipse alcanzó mi punto de ruptura como si nada estuviera mal.

La causa principal para mí fue que Eclipse estaba tratando de configurar la depuración para los objetos proxy Spring CGLIB generados automáticamente. A menos que necesite depurar algo a ese nivel, debe ignorar el problema.

gbshuler
fuente
5

Sería útil si indicara la versión de eclipse que está utilizando y la tecnología (Java JDT, o AJDT para Aspect Java, o C ++ CDT, por ejemplo), solo para estar seguro.

En el lado de Java, supongo que su "Marcó la casilla de verificación de las opciones del compilador" se refiere a esto

En " Window --> Preferences --> Java --> Compiler --> Classfile Generation", todas las Class fileopciones de generación están establecidas en Verdadero:

  • (1) agregar atributos variables,
  • (2) números de línea adicional,
  • (3) agregar el nombre del archivo fuente,
  • (4) preservar las variables locales no utilizadas.

¿Tiene su proyecto los marcados solo a nivel global (Preferencias de Windows) o a nivel específico del proyecto?

¿Y está seguro de que la clase se abrió (en la que intenta establecer un punto de interrupción):

  • es una de sus fuentes (y no proviene de una biblioteca de terceros)
  • es un .java, no un .class?

Intenta limpiar todo y reconstruir todo, verifica posibles conflictos de jarras .

VonC
fuente
Hola VonC, estoy en Eclpise Ganymede, Java 1.6 Sí, tengo la configuración a nivel mundial. Estoy tratando de configurarlo en mi propio código Java escrito, así que sí, tengo los archivos .java y .class. E hice un javap en esa clase. Genera los números de línea
Chandrajeet 05 de
@chandrajeet si tiene esas configuraciones establecidas globalmente, ¿supuse que verificó que su proyecto no las anula con configuraciones específicas del proyecto? Si no, lo único que veo en este momento es poner puntos de interrupción en .class en lugar de .java ...
VonC 05 de
4

Tuve este problema al intentar iniciar Tomcat en modo de depuración desde Eclipse. Tenía un archivo de compilación ANT que se encargaba de la compilación y la implementación. Después de establecer el indicador de depuración en verdadero (como se menciona en otras respuestas) y volver a implementar la aplicación, funcionó bien:

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

NOTA: si acaba de agregar el indicador de depuración y volver a compilar, aún necesita volver a implementar su aplicación en el servidor, ya que aquí es donde Eclipse está depurando los archivos de clase. Muy obvio pero fácil pasar una hora rascándote la cabeza y preguntándote por qué no funciona (confía en mí).

chrisjleu
fuente
4

intente cambiar el jreque usa. Establezca el jreen la carpeta de en su JDKlugar.

Fairjm
fuente
4

Dado que tengo 6 versiones diferentes de Java instaladas, tuve que cambiar mi cumplimiento de JDK predeterminado para que coincida con el de la versión de Java que quería usar. Eclipse por defecto tenía el nivel de cumplimiento del compilador establecido en Java 1.7 cuando todo fue compilado / compilado usando Java 1.6.

Entonces todo lo que hice fue

  1. En el menú de eclipse, vaya a Ventana-> Preferencias-> Java-> Compilador
  2. Bajo JDK Compliance, cambié el nivel de cumplimiento del compilador de 1.7 a 1.6

¡Ahora Eclipse ya no se queja de "No se puede insertar la información de número de línea ausente del punto de interrupción" y los puntos de interrupción de depuración realmente funcionan!

eternalminerals.com
fuente
4

Si nada más funciona, abra la perspectiva de depuración, borre todos los puntos de interrupción existentes y luego vuelva a configurarlos.

Christos
fuente
3

Esto se explica en detalle aquí:

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

Solo para referencia futura, esta es la parte relevante de la respuesta (ignore el hecho que se refiere a una aplicación Spring Boot, el comportamiento es el mismo para muchos otros casos):

Cada vez que establece un punto de interrupción en Eclipse / STS, el IDE intenta establecer el punto de interrupción en la VM si inicia una aplicación. Eso es lo que sucede en su caso cuando ejecuta la aplicación de arranque en modo de depuración.

Para cada clase que se carga en la JVM, el IDE comprueba si necesita establecer un punto de interrupción o no. Si decide establecer el punto de interrupción, intenta hacerlo (utilizando la información de la definición del punto de interrupción en el IDE, incluido su número de línea, ya que generalmente establece puntos de interrupción de línea en un archivo de origen en una línea determinada).

Esta decisión (si establecer el punto de interrupción en una clase cargada dada o no) verifica los tipos en los que establece el punto de interrupción, los tipos adjuntos y las clases internas. Esto asegura que los puntos de interrupción para las clases internas (incluso las clases internas anónimas) se establezcan en la JVM (y no se ignoren).

Spring Boot genera una clase interna para su controlador en tiempo de ejecución (esta es la clase interna generada por CGLIB que aparece en el mensaje de error). Cuando la JVM carga esa clase, intenta establecer el punto de interrupción del número de línea del tipo de cierre (para esta clase interna). Dado que la clase interna generada no tiene ninguna información de número de línea (no necesita tener información de número de línea), el establecimiento del punto de interrupción falla para esta clase interna con el mensaje de error mencionado.

Cuando el IDE carga el tipo de cerramiento (su clase de controlador en sí), también intenta establecer el punto de corte de la línea y lo consigue. Esto se visualiza con el marcador de verificación en el marcador de punto de interrupción.

Por lo tanto, puede ignorar con seguridad el mensaje de error que aparece. Para evitar que aparezca este mensaje de error, puede ir a las preferencias (Java -> Depuración) y deshabilitar "Avisar cuando no pueda instalar el punto de interrupción debido a la falta de atributos de número de línea".

Sampisa
fuente
2

Mi situación fue similar:

  • Estaba depurando una prueba JUnit
  • Estaba usando Mockito para crear un espía, como en spyTask = spy(new Task())
  • Puse el punto de interrupción dentro de la clase que estaba espiando (adentro Task.java)

Este punto de interrupción genera el error en cuestión, cada vez que ejecuto Debug As... > JUnit Test

Para abordar el problema, moví el punto de interrupción 'arriba' a la prueba real (dentro de TaskTest.java). Una vez que se detuvo la ejecución, agregué el punto de interrupción donde lo tenía, originalmente (dentro de Task.java).

Todavía recibí el mismo error, pero después de hacer clic en "ok", el punto de interrupción funcionó bien.

Espero que ayude a alguien,

-mujer

gMale
fuente
Gracias por compartir esto, tengo el mismo problema. Sin embargo, la solución no funcionó para mí. Sin embargo, soy nuevo en Mockito y podría tener algún otro problema que impida que se llame a mi objeto burlado. ¡Pero todavía aprecio que hayas publicado este @gmale!
Michael Osofsky
2

Tuve el mismo problema cuando hice en el servidor de embarcadero y compilé un nuevo archivo .war por ANT. Debería hacer la misma versión del compilador jdk / jre y la ruta de compilación (por ejemplo, jdk 1.6v33, jdk 1.7, ....) después de tener que configurar el compilador de Java como se escribió anteriormente.

Hice todo y aún no funcionaba. La solución fue eliminar los archivos compilados .class y el objetivo del archivo de guerra generado y ahora funciona :)

pesoklp13
fuente
2

Recibí este mensaje con Spring AOP (parece provenir de la biblioteca CGLIB). Al hacer clic en Ignorar parece funcionar bien, todavía puedo depurar.

Mike R
fuente
2

Encontré otra razón más para este mensaje. Estaba programando Scala. La solución fue:

  1. Ejecutar abierto -> Configuraciones de depuración
  2. En la pestaña Principal, en la parte inferior, al lado de los botones "Aplicar" y "Revertir", hay un texto que dice qué Lanzador está utilizando, y al lado, hay un hipervínculo que dice "Seleccionar otro". Es un elemento de interfaz de usuario extraño, no parece procesable a primera vista.
  3. Utilice el enlace "Seleccionar otro" y elija "Iniciador de aplicación Scala (nuevo depurador)". El otro no parece funcionar con Scala.

Ahora la depuración debería funcionar. Tenga en cuenta que he instalado el complemento Scala IDE, es posible que esta opción no esté disponible si no la tiene.

rumtscho
fuente
2

Por encima de las cosas no funcionó para mí. A continuación, las soluciones finalmente funcionaron. Configuraciones de depuración -> Classpath -> Entradas de usuario -> (Agregue la carpeta src del proyecto que desea depurar).

Amruta
fuente
1

Tuve este mismo problema al depurar un WAR (construido a partir de múltiples artefactos del proyecto Eclipse) implementado en Tomcat.

Estoy construyendo todo usando un script de compilación ANT. Si esto es lo que está haciendo, asegúrese de que el indicador debug = true esté configurado en cada tarea de javac ant que tenga. Este fue mi único problema, ¡espero que ayude a tu problema!

ubermensch
fuente
1

Tuve el mismo error con JBoss 7.1 .. E hice lo mismo que Zefiro. Simplemente ignoré el error y pude colocar puntos de interrupción normalmente. En mi caso, estaba construyendo el generador de hormigas pensadas y esta es mi tarea de Java:

<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>
Garrafote
fuente
1

Tuve el mismo problema, pasé mucho tiempo buscando una solución, pero estas soluciones son inútiles, así que estudio todos los casos, finalmente descubrí que hay un conflicto entre las versiones de JDK. A continuación se detallan los pasos para resolver el problema: 1. Elimine todas las versiones JDK y JRE, conserve solo una versión. 2. Establecer el sistema JAVA_HOME y el compilador de Java en Eclipse es el mismo. En algunos casos, el error anterior no desaparecerá, pero podremos ejecutarlo en el modelo de depuración.

Tommy Teo
fuente
1

Una vez que experimenté el mismo error cuando usé junit y Mockito, olvidé agregar @PrepareForTest una clase estática.

Agregar el código a continuación solucionó mi problema.

@PrepareForTest({XXXXX.class})

No estoy seguro de que fuera el mismo caso.

Jonathan
fuente
1

Mi problema era que tenía 2 JAR e intentaba anular uno con el otro en función de su orden en el Java Build Path => Order & Export pestaña en Eclipse, porque uno era para depurar y el otro no (el JAR de depuración era el primero en el orden). Cuando lo hice de esta manera, tuve que adjuntar manualmente una fuente.

Intenté eliminar el JAR que no es de depuración y colocar el JAR de depuración en mi directorio \ WEB-INF \ lib \, limpieza, construcción, etc., y funcionó. Esta vez (habiendo eliminado la fuente adjunta), automáticamente me permitiría navegar a través del código de depuración, sin tener que adjuntar ninguna fuente manualmente. Los puntos de interrupción y la depuración también funcionaron.


En caso de que alguien todavía tenga problemas, también probé todas estas soluciones particulares mencionadas en las otras respuestas:

  • Desmarca, aplica y vuelve a marcar Add line number attributes...
  • Edición manual org.eclipse.jdt.core.prefscomo se menciona en otra respuesta: https://stackoverflow.com/a/31588700/1599699
  • Asegurarse de que el JAR se generaba con la depuración habilitada.
  • Cambiar el nivel de cumplimiento de JDK de 1.6 a 1.7 (con lo que coincide con el JDK que estaba usando).

También hice el apagado habitual del servidor (y me aseguré de que java.exe esté realmente cerrado ...), eliminando los directorios \ build \ en ambos proyectos, reiniciando Eclipse con el parámetro -clean, recreando el JAR de depuración, refrescando, limpieza y compilación del proyecto con el JAR de depuración en él, iniciando el servidor en modo de depuración, publicación / limpieza y puntos de corte.

Andrés
fuente
0

Hice todo lo que se enumeró anteriormente mientras compilaba / construía los frascos, aún tenía el mismo problema.

Finalmente, los cambios de jvmarg enumerados a continuación al iniciar el servidor es lo que finalmente funcionó para mí:

1) Se eliminó / comentó un grupo de argumentos jvm relacionados con javaagent y bootclasspath.

2) Encendió / descomentó la siguiente línea:

Luego, cuando inicio el servidor, puedo alcanzar mis puntos de interrupción. Sospecho que el javaagent estaba de alguna manera interfiriendo con la capacidad de Eclipse para detectar números de línea.

caballo Loco
fuente
0

Verifique / haga lo siguiente:

1) En "Ventana -> Preferencias -> Java -> Compilador -> Generación de archivos de clase", todas las opciones deben ser True:

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

2) En la carpeta .settings de su proyecto, busque un archivo llamado org.eclipse.jdt.core.prefs. Verifique o establezca org.eclipse.jdt.core.compiler.debug.lineNumber = generate

3) Si todavía aparece la ventana de error, haga clic en la casilla de verificación para no mostrar el mensaje de error.

4) Limpiar y construir el proyecto. Comience a depurar.

Normalmente, la ventana de error ya no se muestra y la información de depuración se muestra correctamente.

Ivan Bürcher
fuente
0

Me encontré con este problema también. Estoy usando un script de construcción de hormigas. Estoy trabajando en una aplicación heredada, así que estoy usando jdk versión 1.4.2. Esto solía funcionar, así que comencé a mirar alrededor. Noté que bajo la configuración de Depuración en la pestaña JRE, la versión de Java se había configurado en 1.7. Una vez que lo cambié a 1.4 funcionó.

Espero que esto ayude.

Greg
fuente
0

Estaba tratando de depurar el administrador de registro y necesitaba cambiar el jre a un jdk y luego seleccionar este jdk en la pestaña "principal", "Java Runtime Environment" | "tiempo de ejecución JRE" de la configuración de depuración, entonces todo estaba bien.

Matt Jordan
fuente
0

Vi este problema cuando anoté una clase con @ManagedBean (javax.annotation.ManagedBean). El mensaje de advertencia apareció al ejecutar la aplicación recién cumplida en JBoss EAP 6.2.0. Ignorarlo y correr de todos modos no ayudó: el punto de interrupción nunca se alcanzó.

Estaba llamando a ese bean usando EL en una página JSF. Ahora ... es posible que @ManagedBean no sea bueno para eso (soy nuevo en CDI). Cuando cambié mi anotación a @Model, mi bean se ejecutó pero la advertencia del punto de interrupción también desapareció y llegué al punto de interrupción como se esperaba.

En resumen, ciertamente parecía que la anotación @ManagedBean estropeaba los números de las líneas, independientemente de si era una anotación incorrecta o no.

PMorganCA
fuente
0

Asegúrese de que el proyecto en el que se encuentra la clase principal del tiempo de ejecución es el mismo proyecto en el que está la clase en la que tiene puntos de interrupción . De lo contrario, asegúrese de que ambos proyectos estén en el classpath de la configuración de ejecución y que aparezcan antes de cualquier jarra y carpeta de clase.

Eugene Marin
fuente