1. Depurar HolaMundo
2. Comando help
3. Comando threadgroups
4. Comando threads
5. Comando run
6. Comando where
7. Comando use
8. Comando list
9. Comando dump
10. Comando step

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 threads
`thread <thread id> --` establece el thread por defecto
`suspend [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 thread
`threadgroups --` lista los grupos de threads
`threadgroup <name> --` establece el grupo de thread actual
`print <id> [id(s)] --` imprime un objeto o campo
`dump <id> [id(s)] --` imprime toda la información del objeto
`locals --` imprime las variables locales de la pila actual
`classes --` lista las clases conocidas
`methods <class id> --` lista los métodos de una clase
`stop in <class id>.<method> --` fija un punto de ruptura en un método
`stop at <class id>:<line> --` establece un punto de ruptura en una línea
`up [n frames] --` ascender en la pila de threads
`down [n frames] --` descender en la pila de threads
`clear <class id>:<line> --` eliminar un punto de ruptura
`step --` ejecutar la línea actual
`cont --` continuar la ejecución desde el punto de ruptura
`catch <class id> --` parar por la excepción especificada
`ignore <class id> --` ignorar la excepción especificada
`list [line number] --` imprimir código fuente
`use [source file path] --` ver o cambiar la ruta del fichero fuente
`memory --` informe del uso de la memoria
`load <classname> -` carga la clase Java a ser depurada
`run <args> -` comienza la ejecución de la clase cargada
`!! -` repite el último comando
`help (or ?) -` lista los comandos
`exit (or quit) -` salir del depurador
`>`

### Comando threadgroups

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
    >

### Comando threads

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
    >

### Comando run

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

### Comando use

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]

### Comando list

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]

### Comando dump

El comando dump nos 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]

### Comando step

El comando step nos porporciona el método para ejecutar la línea actual, que estará siendo apuntada por el indicador si hemos 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]

|  | ##### [Anterior] [Indice] [Siguiente]

``