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.
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.
Respuestas:
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 :)
debug="true"
a la javac
tarea del ant
script de construcción funcionó.
Esto solucionó mi problema:
Installed JREs
defecto es en JDK
lugar deJRE
Para problemas relacionados con Spring , considere que en algunos casos genera clases "sin números de línea"; por ejemplo, una @Service
clase 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");
}
}
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.
Esto funcionó para mí:
Window --> Preferences --> Java --> Compiler --> Classfile Generation
, todas las opciones tienen que ser True
.debug="true"
en la <javac>
tarea build.xml .Debug
modoNo 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 ..
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.
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 file
opciones de generación están establecidas en Verdadero:
¿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):
.java
, no un .class
?Intenta limpiar todo y reconstruir todo, verifica posibles conflictos de jarras .
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í).
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
¡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!
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".
Mi situación fue similar:
spyTask = spy(new Task())
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
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 :)
Encontré otra razón más para este mensaje. Estaba programando Scala. La solución fue:
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.
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!
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>
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.
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:
Add line number attributes...
org.eclipse.jdt.core.prefs
como se menciona en otra respuesta: https://stackoverflow.com/a/31588700/1599699Tambié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.
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.
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.
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.
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.
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.
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.