2008-12-16 22 views
51

Obtengo una NullPointerException en una clase de una biblioteca de terceros. Ahora me gustaría depurar todo y necesitaría saber de qué objeto se sostiene la clase. Pero me parece que no puedo establecer un punto de inflexión en una clase de un tercero.¿Cómo establecer un punto de interrupción en Eclipse en una biblioteca de terceros?

¿Alguien sabe una salida a mi problema? Por supuesto que estoy usando Eclipse como mi IDE.

Actualización: la biblioteca es de código abierto.

Respuesta

31

La manera más segura de hacer esto (y terminar con algo que realmente es útil) es descargar el código fuente (dices que es de código abierto), y configurar otro "Proyecto Java" apuntando a ese fuente.

Para ello, obtener el código fuente descargado y descomprimido en algún lugar de su sistema. Haga clic en "Archivo" -> "Nuevo" -> "Proyecto Java". En el siguiente cuadro de diálogo, asígnele un nombre de proyecto y seleccione "Crear proyecto a partir de una fuente existente". Busque la ubicación raíz de la biblioteca de código abierto.

Supongamos que todas las bibliotecas adicionales que el proyecto requiere y las que se incluyen están incluidas en el proyecto que descargó, Eclipse lo resolverá todo y configurará la ruta de compilación para usted.

Deberá quitar el contenedor de código abierto de la ruta de compilación de su proyecto y agregar este nuevo proyecto a la ruta de compilación de su proyecto.

Ahora, puede tratar esto como su código y depurar a voluntad.

Esto se pone alrededor de al menos un par de problemas con otros enfoques:

  1. Se puede "conectar fuente" para el archivo jar, pero si el archivo JAR se compiló sin información de depuración, esto todavía ganó' t trabajo. Si el archivo jar se compiló con información de depuración (lines,source,vars ... ver http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javac.html, y la opción -g).

  2. Puede agregar un "punto de interrupción de excepción" para ver cuándo se lanza la NullPointerException, pero esa es una excepción común, y puede plantearse y tratarse con muchos (cientos de?) Veces antes de la que está buscando para. Además, sin la fuente original, no podrás ver gran cosa sobre el código que arroja la NullPointerException: la probabilidad de que puedas descubrir qué es lo que está mal es bastante baja.

+0

al depurar una biblioteca externa, si vemos los comentarios en las clases de esta biblioteca, ¿significa que se ha compilado utilizando la opción '-g'? El documento establece que '-g: Genera toda la información de depuración, incluidas las variables locales '. Luego, solo se mencionan' fuente ',' líneas 'y' variable '. Leí en coderanch que 'nombres reales de campos' también se usan http://www.coderanch.com/t/262054/java-programmer-SCJP/certification/javac-option. Pero no se menciona nada sobre los comentarios. –

+0

Esperaría que la opción '-g' nos permitiera depurar sin ningún problema, es decir, poder mantener el desempate sincronizado con el código. Supongo que la única forma de hacer esto es dejar los archivos de clase "intactos". ¿Es esto lo que hace?nota: he estado buscando información clara sobre esto, pero parece que generar un jar con & luego sin '-g' es la única forma de descubrir qué cambia realmente cuando se usa esa opción' -g'. –

58

Puede establecer fácilmente puntos de interrupción de métodos en bibliotecas de terceros sin tener la fuente. Simplemente abre la clase (obtendrás la vista "no tengo ninguna fuente"). Abra el contorno, haga clic con el botón derecho en el método que desee y haga clic en Toggle Method Breakpoint para crear el punto de corte del método.

+2

Esto requiere que la biblioteca de terceros haya sido compilada con símbolos de depuración. –

+0

Ah, tal vez no ... pero descubrí que no podía poner un punto de corte de método en la interfaz de ServletResponse, mientras que podría poner uno en la clase de implementación (ServletResponseWrapper). –

+1

Ya no está disponible ... – kolobok

1

Normalmente, debería poder establecer un punto de interrupción. Especialmente si la biblioteca de terceros es de código abierto. Pero si su lib de terceros es de un proveedor comercial, pueden haber compilado el origen con la bandera de depuración desactivada. Esto hará que sea imposible para usted depurarlo. Su proveedor podría haber hecho esto como parte de un proceso de ofuscación para imposibilitar la ingeniería inversa de la biblioteca, o simplemente porque las clases finales compiladas serán más pequeñas.

+0

Preguntaré a un colega si la bandera de depuración fue apagada. – boutta

6

También puede establecer puntos de interrupción en excepciones específicas. Desde la perspectiva de Debug, hay un botón "Add Java Exception Breakpoint", y allí puede agregar "NullPointerException". Su depurador suspenderá la ejecución tan pronto como se produzca dicha excepción.

+0

Esto no captura las excepciones lanzadas en la biblioteca. Tal vez haya algo sobre lo que dijo Bent con las banderas de depuración no configuradas. – boutta

+0

Nunca he visto que eso suceda. La JVM todavía tiene la traza de pila, simplemente no hay números de fuente o de línea, por lo que todavía debe romperse en la excepción. – Robin

+0

Utilicé esto para atrapar una excepción de servlet en Eclipse para depurar un problema que parecía no detectar en el código de la aplicación. Muchas gracias por este consejo! –

1

Sólo hay que conectar la fuente (o usar algo que se conecta de forma automática el frasco de origen) y luego ponga un punto de interrupción en la forma normal, haciendo doble clic a la izquierda de la línea de interés.

+0

Este método me ayudó mucho al depurar mi aplicación vinculada a un proyecto de código abierto. En mi caso, tengo (a) un jar con clases, (b) un jar con las fuentes correspondientes, y (c) he descomprimido las fuentes en mi disco local. Para colocar un punto de interrupción en una función dentro del proyecto de código abierto, I (1) abrió el archivo fuente de unidad local específico en Eclipse, y (2) colocó un punto de interrupción en la línea de función deseada. Cuando ejecuté mi aplicación, Eclipse fue lo suficientemente inteligente como para romper en el punto deseado. –

1

Para hacer que esto funcione con una aplicación web materializada maven, tuve que hacer tres cosas.

1) Cree un nuevo proyecto de eclipse con el código fuente de la jarra de terceros.

2) Elimine la referencia al contenedor de las dependencias pom.xml.

3) Agregue el nuevo proyecto de eclipse al Ensamblaje de despliegue en las propiedades del proyecto.

4) Agregue el nuevo proyecto de eclipse a las propiedades del proyecto -> Ruta de compilación de Java -> Proyectos del proyecto existente que hace referencia al proyecto de un tercero.

Si el tercer proyecto se ha agregado a su repositorio maven correctamente, con las fuentes, maven automáticamente descargará el código fuente apropiado y le permitirá agregar puntos de interrupción sin tener que hacer ninguno de los pasos anteriores; sin embargo, he aprendido que no siempre puedes contar con esto.

Cuestiones relacionadas