|
Uso del Depurador de Java |
Anterior | Siguiente |
Aquí solamente se tratarán por encima los comandos que proporciona el jdb, pero sin entrar en detalles de su funcionamiento, porque no merece la pena. Es mucho mejor recurrir a herramientas visuales para poder depurar con cierta comodidad el código Java, que pasarse horas y horas intentando descifrar los comandos del jdb; aunque sí se hablará de la Consola Java, que proporcionan todos los Navegadores y que puede resultar de vital importancia en ciertos casos, fundamentalmente en aquellas ocasiones en que el comportamiento de applets difiere en el navegador con respecto al appletviewer, circunstancia nada extraña, por otra parte. Para poder utilizar el depurador, las aplicaciones Java deben estar compiladas con la opción de depuración activada, -g. Posteriormente se puede lanzar appletviewer con la opción de depuración, debug, y ya estará puesto en marcha el jdb. Se ha modificado el ya conocido applet básico para utilizarlo en una sesión de ejemplo con el depurador. Se compilaría con el comando: %javac -g hm.java y el contenido del applet HolaMundo modificado y guardado en el fichero hm.java sería el siguiente: // Applet HolaMundo de ejemplo, para depurar // import java.awt.Graphics; import java.applet.Applet; public class hm extends Applet { int i; public void paint( Graphics g ) { i = 10; g.drawString( "Hola Mundo!",25,25 ); } } Una vez compilado, se inicia la sesión lanzando el visor de applets de Sun con la opción de depuración, utilizando el comando: %appletviewer -debug hm.html El fichero hm.html contiene las líneas mínimas para poder activar el applet, estas líneas son las que se reproducen a continuación: <html> <applet code=hm.class width=100 height=100> </applet> </html> Se inicia pues la sesión con el depurador y se va a ir transcribiendo lo que aparece en la pantalla a medida que se introducen comandos: %appletviewer -debug hm.html Loading jdb... 0xee301bf0:class(sun.applet.AppletViewer) > El comando help proporciona una lista de los comandos que están disponibles en la sesión de jdb. Esta lista es la que sigue, en donde se ha aprovechado la presencia de todos los comandos para comentar la acción que cada uno de ellos lleva a cabo.
El comando threadgroups permite ver la lista de threads que se están ejecutando. Los grupos system y main deberían estar siempre corriendo. >threadgroups 1.(java.lang.ThreadGroup)0xee300068 system 2.(java.lang.ThreadGroup)0xee300a98 main > El comando threads se utiliza para ver la lista completa de los threads que se están ejecutando actualmente. >threads Group system: 1.(java.lang.Thread)0xee300098 clock handler cond 2.(java.lang.Thread)0xee300558 Idle thread run 3.(java.lang.Thread)0xee3005d0 sync Garbage Collector cond 4.(java.lang.Thread)0xee300620 Finalizer thread cond 5.(java.lang.Thread)0xee300a20 Debugger agent run 6.(java.tools.debug.BreakpointHandler)0xee300b58) Breakpoint handler cond Group main: 7.(java.lang.Thread)0xee300048 main suspended > El comando run es el que se utiliza para arrancar el appletviewer en la sesión de depuración. Lo teclearemos y luego volveremos a listar los threads que hay en ejecución. >run run sun.applet.AppletViewer hm.html running... main[1]threads threads Group sun.applet.AppletViewer.main: 1.(java.lang.Thread)0xee3000c0 AWT-Motif running 2.(sun.awt.ScreenUpdater)0xee302ed0 ScreenUpdater cond. Waiting Group applet-hm.class: 3.(java.lang.Thread)0xee302f38 Thread-6 cond. Waiting main[1] El visor de applets de Sun aparecerá en la pantalla y mostrará el conocido mensaje de saludo al Mundo. Ahora se puede rearrancar el appletviewer con un punto de ruptura, para detener la ejecución del applet, y así poder seguir mostrando los comandos disponibles en el jdb. Main[1]exit %appletviewer -debug hm.html Loading jdb... 0xee3009c8:class(sun.applet.AppletViewer) >stop in hm.paint Breakpoint set in hm.paint >run run sun.applet.AppletViewer hm.html running... Breakpoint hit: hm.paint(hm.java:9) AWT-Motif[1] El comando where mostrará la pila de ejecución del applet. AWT-Motif[1]where [1]hm.paint(hm.java:9) [2]sun.awt.motif.MComponentPeer.paint(MComponenetPeer.java:109) [3]sun.awt.motif.MComponentPeer.handleExpose(MComponenetPeer.java:170) AWT-Motif[1] El comando use nos informa del camino donde jdb va a buscar los ficheros fuentes que contienen el código Java de las clases que se están depurando. Por defecto, utilizará el camino que se especifique en la variable de entorno CLASSPATH. AWT-Motif[1]use /usr/local/java/classes: AWT-Motif[1] El comando list mostrará el código fuente actual al comienzo del punto de ruptura que hayamos fijado. AWT-Motif[1]list 9 public void paint( Graphics g ) { 10 => i = 10; 11 g.drawString( "Hola Mundo!",25,25 ) ; 12 } 13 } AWT-Motif[1] El comando dump permitirá ahora ver el valor del objeto g pasado desde el appletviewer. AWT-Motif[1]dump g g = (sun.awt.motif.X11Graphics)0xee303df8 { int pData = 1342480 Color foreground = (java.awt.Color)0xee302378 Font font = (java.awt.Font)0xee302138 int originX = 0 int originY = 0 float scaleX = 1 float scaleY = 1 Image image = null } AWT-Motif[1] El comando step proporciona el método para ejecutar la línea actual, que estará siendo apuntada por el indicador si se ha utilizado el comando list. AWT-Motif[1]step Breakpoint hit: hm.paint(hm.java:11) AWT-Motif[1]list 9 public void paint( Graphics g ) { 10 i = 10; 11 => g.drawString( "Hola Mundo!",25,25 ); 12 } 13 } AWT-Motif[1] |
|