JDB - Guía rápida
La depuración es un procedimiento técnico para encontrar y eliminar errores o defectos en un programa y obtener los resultados esperados. La depuración incluye pruebas y monitoreo. Es muy complejo cuando las subunidades de un programa están estrechamente acopladas. Podemos depurar un programa utilizando las herramientas de depuración que siguen las API prescritas. Un depurador le permite revisar cada aspecto de un código, inspeccionar todos los elementos y eliminar errores, si los hubiera.
Técnicas de depuración
Existen diferentes tipos de técnicas para depurar un programa Java. El antiguo método de depuración es mediante el uso de declaraciones de impresión al final de cada segmento que imprimirá las declaraciones de seguimiento en la consola. Eche un vistazo al siguiente código.
pubic class Add
{
public static void main(String ar[])
{
int a=ar[0];
system.out.println("A : " +a);
int b=ar[1];
system.out.println("B : " +b);
int c = a + b;
system.out.println("C = a + b : " +c);
}
}
Aquí, tenemos un programa que suma dos números e imprime la salida. Observe que en cada paso, hemos introducido una declaración de impresión que imprime el estado del programa en la consola. Este es el enfoque tradicional para depurar un programa.
Además, contamos con conceptos avanzados que se pueden utilizar para depurar un programa como:
- stepping
- puntos de interrupción, y
- excepciones o puntos de observación.
Tipos de depuración
Podemos depurar un programa usando varios métodos:
- Usando código de bytes Java (versión compilada del código Java)
- Usar comentarios dentro de los programas
- Adjuntar clase a un programa en ejecución
- Depuración remota
- Depuración bajo demanda
- Depuración de código optimizada
Depuradores de Java
A continuación, se muestran algunos ejemplos de depuradores de Java disponibles en el mercado:
- Los IDE como Eclipse, Netbeans, etc. contienen sus propios depuradores (Visual cafe, Borland, JBuilder)
- GUI de depurador independiente (como Jikes, depurador de plataforma Java y JProbe)
- Depurador de línea de comandos (JDB de Sun)
- Bloc de notas o VI impulsado (seguimiento de pila)
Este tutorial cubre cómo usar el depurador de línea de comandos, jdb.
JDB
El depurador de Java (JDB) es una herramienta para que las clases de Java depuren un programa en la línea de comandos. Implementa la arquitectura del depurador de la plataforma Java. Ayuda a detectar y corregir errores en un programa Java usando la Interfaz de depuración Java (JDI).
JDB en JDK
La siguiente arquitectura define el rol de JDB en JDK. Contiene principalmente tres unidades:
- Interfaz Java Virtual Machine Tool (JVM TI)
- Grupo de cableado de depuración de Java (JDWP)
- Interfaz de depurador de Java (JDI)
JVM TI
Es una interfaz de programación nativa implementada por VM. Proporciona formas de inspeccionar y depurar el estado de la aplicación que se ejecuta en la máquina virtual. Permite un implementador (VM Implementer) que se puede incluir fácilmente en la arquitectura de depuración. También utiliza un canal de terceros llamadoJDWP para comunicarse.
JDWP
Define el formato de la información y las solicitudes que pasan entre el proceso de depuración y la interfaz del depurador. El propósito principal de tener un JDWP es permitir que el depurador y el depurador se comuniquen cuando se ejecutan en máquinas virtuales separadas o en plataformas separadas.
JDI
Es una interfaz Java de alto nivel implementada como front-end. Define la información variable a nivel de código de usuario. Se recomienda utilizar una capa JDI para todo el desarrollo de depuradores. Utiliza JDWP para comunicarse con la JVM depurada.
Este capítulo explica cómo instalar JDB en sistemas basados en Windows y Linux. JDB es parte de JDK. Por lo tanto, la instalación de JDK es suficiente para usar JDB en el símbolo del sistema.
Requisitos del sistema
Estos son los requisitos del sistema para instalar JDB:
JDK | Java SE 2 JDK 1.5 o superior |
Memoria | 1 GB de RAM (recomendado) |
Espacio del disco | Sin requisito mínimo |
Versión del sistema operativo | Windows XP o superior, Linux |
Siga los sencillos pasos que se indican a continuación para instalar JDB en su sistema.
Paso 1: verificar la instalación de Java
En primer lugar, debe tener instalado el kit de desarrollo de software (SDK) de Java en su sistema. Para verificar esto, ejecute cualquiera de los dos comandos dependiendo de la plataforma en la que esté trabajando.
Si la instalación de Java se ha realizado correctamente, muestra la versión actual y las especificaciones de la instalación de Java. En la siguiente tabla se proporciona un resultado de muestra.
Plataforma | Mando | Salida de muestra |
---|---|---|
Ventanas | Abra la consola de comandos y escriba: \>java –version |
Versión de Java "1.7.0_60" Entorno de tiempo de ejecución Java (TM) SE (compilación 1.7.0_60-b19) VM de servidor Java Hotspot (TM) de 64 bits (compilación 24.60-b09, modo mixto) |
Linux | Abra el terminal de comando y escriba: $java –version |
versión de Java "1.7.0_25" Entorno de tiempo de ejecución abierto de JDK (rhel-2.3.10.4.el6_4-x86_64) Abra la máquina virtual del servidor JDK de 64 bits (compilación 23.7-b01, modo mixto) |
Suponemos que los lectores de este tutorial tienen la versión 1.7.0_60 de Java SDK instalada en su sistema. En caso de que no tenga Java SDK, descargue su versión actual desde el enlacehttp://www.oracle.com/technetwork/java/javase/downloads/index.html e instalarlo.
Paso 2: Configurar el entorno Java
Configure la variable de entorno JAVA_HOME para que apunte a la ubicación del directorio base donde está instalado Java en su máquina. Por ejemplo,
Plataforma | Descripción |
---|---|
Ventanas | establezca JAVA_HOME en C: \ ProgramFiles \ java \ jdk1.7.0_60 |
Linux | exportar JAVA_HOME = / usr / local / java |
Agregue la ruta completa de la ubicación del compilador Java a la ruta del sistema.
Plataforma | Descripción |
---|---|
Ventanas | Agregue la cadena "C: \ Archivos de programa \ Java \ jdk1.7.0_60 \ bin" al final de la variable de sistema PATH. |
Linux | export PATH = $ PATH: $ JAVA_HOME / bin / |
Ejecuta el comando java -version desde el símbolo del sistema como se explicó anteriormente.
Paso 3: Verificación de la instalación de JDB
Verifique la versión de JDB de la siguiente manera:
Plataforma | Mando | Salida de muestra |
---|---|---|
Ventanas | Abra la consola de comandos y escriba: \>jdb –version |
Esta es la versión 1.6 de JDB (Java SE versión 1.7.0_60) |
Linux | Abra el terminal de comando y escriba: $jdb –version |
Esta es la versión 1.6 de JDB (Java SE versión 1.7.0_60) |
Este capítulo explica la sintaxis del comando JDB. La sintaxis contiene cuatro secciones enumeradas a continuación:
- JDB
- option
- class
- arguments
Sintaxis
La sintaxis de JDB es la siguiente.
jdb [ options ] [ class ] [ arguments ]
JDB
Llama a jdb.exe desde el kit de desarrollo de Java.
Opciones
Estos incluyen las opciones de la línea de comandos que se utilizan para depurar un programa Java de manera eficiente. El iniciador de JDB acepta todas las opciones (como -D, -classpath y -X) y algunas opciones avanzadas adicionales como (-attach, -listen, -launch, etc.).
Clase
Es el nombre de la clase en la que desea realizar las operaciones de depuración.
Argumentos
Estos son los valores de entrada dados a un programa en tiempo de ejecución. Por ejemplo, arg [0], arg [1] al método main ().
En los cuatro segmentos anteriores, las opciones son las más importantes.
Este capítulo describe las opciones importantes disponibles en JDB que se envían como argumentos con el comando jdb.
Opciones
La siguiente tabla contiene una lista de opciones aceptadas por JDB:
Nombre | Descripción |
---|---|
-ayuda | Muestra el mensaje de ayuda y enumera las opciones relacionadas. |
-sourcepath | Utiliza la ruta dada para los archivos de origen si no se especifica la ruta, entonces toma la ruta predeterminada “.”, Es decir, el directorio actual. |
-adjuntar | Adjunta el depurador a la máquina virtual en ejecución especificando la dirección de la máquina virtual en ejecución. |
-escucha | Espera a que la máquina virtual en ejecución se conecte mediante un conector estándar. |
-escuchar cualquier | Espera a que la máquina virtual en ejecución se conecte utilizando cualquier dirección. |
-lanzamiento | Inicia la aplicación depurada inmediatamente en el trabajo de inicio. |
-lista de conectores | Enumera los conectores disponibles en esta VM. |
-conectar | Se conecta a la máquina virtual de destino mediante un conector con nombre con los valores de los argumentos enumerados. |
-dbgtrace | Imprime información para depurar jdb. |
-tclient | Ejecuta la aplicación en Java Hotspot VM (cliente). |
-servidor | Ejecuta la aplicación en Java Hotspot VM (servidor). |
-Jopción | Pasa la opción a la máquina virtual Java utilizada para ejecutar JDB. |
Usar opciones con comandos
Los siguientes comandos muestran cómo utilizar algunas de las opciones anteriores:
-ayuda
El siguiente comando obtiene -ayuda sobre el uso de JDB.
\>jdb -help
-adjuntar
El siguiente comando adjunta el depurador a una máquina virtual específica (número de puerto: 1099).
\> jdb -attach 1099
-escucha
El siguiente comando hace que el proceso JDB que se ejecuta en la VM actual espere usando el conector estándar (VM en 8008).
\>jdb -listen 8088
-escuchar cualquier
El siguiente comando hace que el proceso de JDB que se ejecuta en la VM actual espere usando cualquier conector (VM en el puerto que se está ejecutando actualmente).
\>jdb –listenany
-tclient
El siguiente comando ejecuta la aplicación en Java Hotspot (™) VM (cliente).
\>jdb –tclient
-servidor
El siguiente comando ejecuta la aplicación en Java Hotspot (™) VM (servidor).
\>jdb -tserver
Este capítulo describe cómo iniciar una sesión JDB de diferentes formas. El lanzamiento de JDB es la técnica que se utiliza con frecuencia para iniciar una sesión de JDB.
Hay dos formas diferentes de iniciar una sesión JDB:
- Iniciando la sesión de JDB agregando la clase (nombre de la clase principal).
- Adición de JDB para ejecutar JVM para iniciar la sesión.
Iniciar una sesión agregando una clase
El siguiente comando inicia una sesión de JDB:
Sintaxis
\>jdb <classname>
Ejemplo
Supongamos que tenemos una clase llamada TestClass. El siguiente comando inicia una sesión JDB desde TestClass.
\>jdb TestClass
Si sigue este comando, inicia una nueva máquina virtual Java con los parámetros especificados. A continuación, carga la clase y la detiene antes de ejecutar la primera instrucción de la clase.
Inicie una sesión agregando JDB a una JVM en ejecución
A continuación se muestra la sintaxis y el ejemplo para iniciar una sesión JDB agregando el JDB a una JVM en ejecución.
Sintaxis
La siguiente sintaxis es para la sesión JDB:
-agentlib:jdwp=transport=dt_shmem,address=
,server=y,suspend=n
Ejemplo
Supongamos que el nombre de la clase principal es TestClassy JVM permite que JDB lo conecte más tarde. El siguiente es el comando para agregar JDB a JVM:
\>java
-agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n TestClass
Ahora puede adjuntar la JDB a la JVM con el siguiente comando:
\> jdb -attach jdbconn
Note: Aquí el TestClass no se agrega al comando JDB, porque JDB está conectado a la VM en ejecución en lugar de lanzar una nueva.
Este capítulo lo lleva a través de los comandos básicos de JDB. Después de iniciar una sesión, estos comandos se utilizan para depurar un programa.
La siguiente es la lista de comandos utilizados para depurar.
Nombre | Descripción |
---|---|
ayuda o? | El más importante JDBmando; muestra una lista de comandos reconocidos con una breve descripción. |
correr | Después de comenzar JDB y estableciendo los puntos de interrupción necesarios, puede utilizar este comando para iniciar la ejecución y depurar una aplicación. |
cont | Continúa la ejecución de la aplicación depurada después de un punto de interrupción, una excepción o un paso. |
impresión | Muestra objetos Java y valores primitivos. |
tugurio | Para valores primitivos, este comando es idéntico a imprimir. Para los objetos, imprime el valor actual de cada campo definido en el objeto. Se incluyen campos estáticos y de instancia. |
hilos | Enumera los subprocesos que se están ejecutando actualmente. |
hilo | Selecciona un hilo para que sea el hilo actual. |
dónde | Vuelca la pila del hilo actual. |
Ejemplo
Supongamos que tenemos una clase de muestra llamada Add para los siguientes ejemplos:
Add.java
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
Compile esta clase Add.java usando el siguiente comando:
\>javac Add.java
correr
Este comando ejecuta el archivo de clase principal, que se agrega a JDB para su depuración. Ejecute los siguientes comandos para ejecutar la clase Add.
\>jdb Add
initializing jdb …
>run
Al ejecutar estos comandos, puede ver el siguiente resultado:
Este capítulo explica el concepto de puntos de interrupción y cómo establecer puntos de interrupción en un programa. Un punto de interrupción introduce una parada o pausa explícita en la ejecución de un programa en una línea particular de código durante la depuración. Es útil adquirir conocimientos sobre las variables del programa en su ejecución.
Sintaxis
El siguiente comando establece un punto de interrupción en un número de línea en particular:
> stop at <class name>:<Line no>
El siguiente comando establece un punto de interrupción en un método en particular o en una variable en particular:
> stop in <class name>:< Method name | Variable name>
Ejemplo
El siguiente ejemplo muestra cómo configurar un punto de interrupción en una clase.
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
Guarde el archivo anterior como Add.java. Compile este archivo usando el siguiente comando:
\>javac Add.java
Depuración
Tomemos un ejemplo de depuración. Aquí, comenzamos el proceso de depuración configurando un punto de interrupción en main (). A continuación se muestran los pasos a seguir en el proceso de depuración:
Paso 1: Inicie una sesión JDB
El siguiente comando inicia una sesión de JDB en la clase Add para depurar:
\> jdb Add
Paso 2: establece un punto de interrupción
El siguiente comando establece un punto de interrupción en el método main () de la clase Add.
> stop in Add.main
Si el punto de interrupción se establece correctamente, puede ver el siguiente resultado:
Deferring breakpoint Add.main.
It will set after the class is loaded.
>
Paso 3: comience a depurar
El siguiente comando inicia la ejecución de la clase Add:
> run Add
Si ejecuta este comando, verá el siguiente resultado. En esta salida, encuentra que la ejecución se detiene en la posición del punto de interrupción, es decir, en la función main ().
La ejecución se detiene en la primera línea del método principal, es decir, en "int a = 5, b = 6;" o Línea no: 11 en el código. Puede observar esta información en la salida.
Paso 4: continuar con la ejecución
El siguiente comando continúa la ejecución del programa:
cont
Le da la parte de ejecución restante y la salida de la siguiente manera:
> Add:11
The application exited
\>
Este capítulo explica cómo utilizar el concepto de Stepping al depurar un programa. Stepping es la función del depurador que le permite ejecutar el código pasando línea por línea. Con esto, puede examinar cada línea del código para asegurarse de que se comportan según lo previsto.
Los siguientes comandos se utilizan en el proceso de creación de pasos:
- paso: pasos a la siguiente línea de ejecución
- lista: examina dónde se encuentra en el código
- cont: continúa la ejecución restante
Ejemplo
El siguiente ejemplo usa la clase Add que hemos usado en el capítulo anterior:
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
Guarde el archivo anterior como Add.java. Compile este archivo usando el siguiente comando:
\>javac Add.java
Supongamos que el punto de interrupción se establece en el método main () de la clase Add. Los siguientes pasos muestran cómo aplicar el paso a paso en la clase Agregar.
Paso 1: ejecutar el trabajo
El siguiente comando comienza a ejecutar la clase llamada Agregar.
> run Add
If you execute this command, you get to see the following output. In this output, you can find that the execution stops at the breakpoint position, i.e., at the main() method.
The execution stops at the first line of the main method, that is at "int a=5, b=6;" or Line no: 11 in the code. You can observe this information in the output.
Step 2: Step through the Code
The following command steps the execution to the next line.
main[1] step
Now the execution steps to Line no: 12. You get to see the following output.
Step 3: List the Code
The following command lists the code:
main[1] list
You get the following output. List command is used to let you know the line in the code up to which the program control has reached. Notice the arrow mark => in the following screenshot that shows the current position of the program control.
Step 4: Continue Execution
The following command continues to execute the code:
main[1] cont
This command continues executing the remaining lines of the code. The output is as shown below:
> Add:11
The application exited
\>
Generally, there are three types of stepping:
- Step Into
- Step Over
- Step Out
Step Into
Using this command, you can step to the next line of the code. If the next line of the code is a function call, then it enters the function by driving the control at the top line of the function.
In the following code, the arrow mark defines the controller in the code.
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
-> Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
If you use the step into command, the controller moves to the next line, i.e., "int c = ob.addition(a,b);". At this line, there is a function call addition(int, int) hence the controller moves to the topmost line of the addition function with the arrow mark as shown below:
public class Add
{
public int addition( int x, int y)
-> {
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
Step Over
Step Over also executes the next line. But if the next line is a function call, it executes that function in the background and returns the result.
Let us take an example. In the following code, the arrow mark defines the control in the code.
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
-> Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
If you use the step over command, the control moves to the next line, i.e., "int c = ob.addition(a,b);". In this line, there is a function call addition(int, int) hence the function execution is done in the background and the result is returned to the current line with the arrow mark as shown below:
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
Add ob = new Add();
-> int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
Step Out
Step Out executes the next line. If the next line is a function call, it skips that and the function execution continues with the remaining lines of the code.
Let us take an example. In the following code, the arrow mark defines the controller in the code.
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
-> Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
If you use the step out command, the controller moves to the next line, i.e., "int c = ob.addition(a,b);". In this line, there is a function call addition(int, int) hence the function execution is skipped and the remaining execution continues with the arrow mark as shown below:
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
Add ob = new Add();
-> int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
This chapter explains how to handle the exception class using JDB. Generally, whenever a program raises an exception without a catch statement, then the VM prints the exception line, the cause of the exception, and exits. If the exception has been raised with a catch statement, then the exception is handled by the catch statement. Here, the VM prints the output with the cause of exception.
When the class that raises the exception is running under JDB, it also throws the uncaught exception. That exception can be handled using the catch command.
Example
Let us take an example of the class JdbException:
public class JdbException
{
public static void main(String ar[]) throws Exception
{
int a=8, b=0;
System.out.println("Welcome");
System.out.println("Ex: "+(a/b));
}
}
Save the above file with the name JdbException.java. Compile this file using the following command:
\>javac JdbException.java
Follow the steps given below to handle the exception.
Step 1: Run the Class
The following command executes the class named JdbException as follows:
\>jdb JdbException
>run
This JdbException class contains an exception, hence you get to see the following output:
Step 2: Catch the Exception
The following command catches the exception:
mian[1] catch java.lang.ArithmeticException
It will give you the following output:
Set all java.lang.ArithmeticException
Step 3: Continue Execution
The following command continues the execution. Now the catch handles the arithmetic exception as follows:
This chapter explains how to use JDB in Eclipse. Before proceeding further, you need to install Eclipse Indigo. Follow the steps given below to install Eclipse Indigo on your system.
Step 1: Download and Install Eclipse
You can download Eclipse from the following link: http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/indigosr2
Step 2: Create a New Project and a New Class
- Create a new Java project by following the options File-> New -> Java project.
- Name it as “sampledebug”.
- Create a new class by right clicking on the samplebebug project.
- Select options ->new -> class
- Name it as “Add.java”
Add.java
public class Add
{
public int addition( int x, int y)
{
int z = x+y;
return z;
}
public static void main( String ar[ ] )
{
int a = 5, b = 6;
Add ob = new Add();
int c = ob.addition(a,b);
System.out.println("Add: "+c);
}
}
Step 3: Open the Debug Perspective
Follow the instructions given below to open the debug perspective.
On the Eclipse IDE, go to Window -> Open perspective -> Debug. Now you get the debug perspective for the program Add.java. You get to see the following window.
Sections in Debug Perspective
The sections in the Debug perspective are as follows:
Coding Section
Java code is displayed in this section. It is the code you want to debug, that is, Add.java. Here we can add a breakpoint on a line by double clicking in front of the line. You find the blue bubble with an arrow symbol to point out the breakpoint of that line. See the following screenshot; you can find the selected area with a red circle pointed as “1”.
- Double click here. You can set the breakpoint for this line.
Breakpoint Section
This section defines the list of breakpoints that are set to the program code. Here we can add, delete, find, and manage the breakpoints. The following screenshot shows the breakpoint section.
Observe the following options in the given screenshot:
Using the check box in the left, we can select or deselect a breakpoint. Here, we use one breakpoint, i.e., Add class-main() method.
The single cross icon “X” is used to delete the selected breakpoint.
The double cross icon “XX” is used to delete all the breakpoints in your code.
The arrow pointer is used to point to the code where the selected breakpoint is applied.
The remaining functionalities in the breakpoint section are as follows:
Hitcount : It shows how many times the control hits this breakpoint. It is used for recursive logic.
Suspend thread : We can suspend the current thread by selecting it.
Suspend VM : We can suspend the VM by selecting it.
Debug Section
This section is used for the process of debugging. It contains options that are used in debugging.
Start debugging : Follow the instructions given below to start debugging.
Right click on the code -> click Debug as -> click 1 Java application.
The process of debugging starts as shown in the following screenshot. It contains some selected options, highlighted using numeric digits.
We apply a breakpoint on the Add class main() method. When we start debugging, the controller gets stuck at the first line of the main() method.
It is used to Resume the debugging process and skip the current breakpoint. It works similar to the cont command in the JDB command line.
It is used to stop the debugging process.
It works similar to the step in process in the JDB command line. It is used for moving the control to the next line, i.e., point “1” moves to the next line.
It works similar to the step over process in the JDB command line.
It is used to see on which line the breakpoint is applied.
Follow the given steps and sections to debug your code in eclipse IDE. By default, every IDE contains this debugging process.