El depurador de Java, jdb es un depurador de línea de comandos, similar al que Sun proporciona en sus Sistemas, dbx. Es complicado de utilizar y un tanto críptico, por lo que, en principio, tiene escasa practicidad y es necesaria una verdadera emergencia para tener que recurrir a él.
Trataremos por encima los comandos que proporciona el jdb, pero sin entrar en detalles de su funcionamiento, porque no merece la pena. Casi es mejor esperar a disponer de herramientas visuales para poder depurar con cierta comodidad nuestro código Java.
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 habremos
puesto en marcha jdb.
Depurar HolaMundo
Hemos modificado nuestro applet de ejemplo para utilizarlo en
nuestra sesión de ejemplo con el depurador. Se compilaría
con el comando:
%javac -g hm.java
y el contenido de nuestro 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, iniciamos 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 reproducimos:
<html> <applet code=hm.class width=100 height=100> </applet> </html>
Se inicia pues la sesión con el depurador y vamos a ir reproduciendo lo que aparece en la pantalla a medida que vamos introduciendo comandos:
%appletviewer -debug hm.html Loading jdb... 0xee301bf0:class(sun.applet.AppletViewer) >
Comando help
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 hemos aprovechado la presencia
de todos los comandos para comentar la acción que cada
uno de ellos lleva a cabo.
>help
** command list **
threads [threadgroup] --
lista threadsthread <thread id> --
establece el thread por defectosuspend [thread id(s)] --
suspende threads (por defecto, todos)resume [thread id(s)] --
continúa threads (por defecto, todos)where [thread id]|all --
muestra la pila de un threadthreadgroups --
lista los grupos de threadsthreadgroup <name> --
establece el grupo de thread actualprint <id> [id(s)] --
imprime un objeto o campodump <id> [id(s)] --
imprime toda la información del objetolocals --
imprime las variables locales de la pila actualclasses --
lista las clases conocidasmethods <class id> --
lista los métodos de una clasestop in <class id>.<method> --
fija un punto de ruptura en un métodostop at <class id>:<line> --
establece un punto de ruptura en una líneaup [n frames] --
ascender en la pila de threadsdown [n frames] --
descender en la pila de threadsclear <class id>:<line> --
eliminar un punto de rupturastep --
ejecutar la línea actualcont --
continuar la ejecución desde el punto de rupturacatch <class id> --
parar por la excepción especificadaignore <class id> --
ignorar la excepción especificadalist [line number] --
imprimir código fuenteuse [source file path] --
ver o cambiar la ruta del fichero fuentememory --
informe del uso de la memoriaload <classname> -
carga la clase Java a ser depuradarun <args> -
comienza la ejecución de la clase cargada!! -
repite el último comandohelp (or ?) -
lista los comandosexit (or quit) -
salir del depurador>
>threadgroups 1.(java.lang.ThreadGroup)0xee300068 system 2.(java.lang.ThreadGroup)0xee300a98 main >
>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 >
>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 vamos a rearrancar el appletviewer con un punto de ruptura, para detener la ejecución del applet, y podamos 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]
Comando where
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]
AWT-Motif[1]use /usr/local/java/classes: AWT-Motif[1]
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]
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]
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]
|
[Anterior] [Indice] [Siguiente] |