Un depurador informático es una herramienta de software utilizada para detectar, diagnosticar y corregir errores en los programas informáticos. Permite inspeccionar la ejecución del código, detenerlo en puntos concretos, revisar los valores de las variables y comprender por qué una aplicación presenta un comportamiento inesperado.
Aunque la depuración se relaciona principalmente con la programación, sus métodos también pueden aplicarse a problemas cotidianos: explicar un concepto para comprobar si realmente se entiende, dividir un proceso complejo en pasos, observar los datos que cambian y comprobar una hipótesis antes de modificar todo el sistema.
Qué es un depurador informático
Los depuradores son herramientas esenciales en el ámbito de la programación informática, diseñadas para ayudar a los desarrolladores a encontrar y solucionar problemas en su código de forma eficaz. Proporcionan una forma de inspeccionar la ejecución del código y comprender la causa de cualquier comportamiento inesperado o error.
Depurador: Herramienta de software utilizada por los programadores para comprobar, diagnosticar y corregir errores en los programas informáticos. Proporciona funcionalidades como establecer puntos de interrupción, inspeccionar variables y controlar el flujo de ejecución del programa.
Un depurador es un programa que permite detectar y diagnosticar fallos en programas informáticos. El objetivo de estas herramientas es garantizar, a largo plazo, que el software funcione en todos los dispositivos y plataformas para los que está pensado.
Por este motivo, muchos depuradores no solo analizan el código fuente del programa, sino también su interacción con el sistema operativo que lo ejecuta y con los elementos de hardware.
El proceso de depuración o debugging ocurre mientras el programa se ejecuta, de forma que no es necesario cerrarlo para llevar a cabo el análisis. El término depuración o debugging describe el proceso de detección de fallos de software.
Qué significa depurar
La depuración de código es una habilidad esencial para cualquier programador. Es el proceso de identificar y corregir errores en el código fuente de un programa informático.
Los errores pueden ser causados por una variedad de factores, como errores de sintaxis, errores de lógica o errores de datos. Existen muchas técnicas diferentes de depuración de código, y la mejor técnica para utilizar dependerá de la naturaleza del error.
La palabra debugging está compuesta por el prefijo inglés de- (con una función similar a la del prefijo des- en español) y la palabra bug (bicho). Este último término se usa desde hace décadas en el ámbito del desarrollo de software para hacer referencia a errores de todo tipo en los programas.
Por este motivo, la corrección de los errores de software se denomina también bugfix. Los depuradores o debuggers son programas informáticos que facilitan a los desarrolladores la tarea de buscar errores en el software.
Qué problemas ayuda a encontrar
Durante el proceso de desarrollo de software, se pueden producir dos tipos de errores: errores de compilación o errores lógicos.
Cuando se desarrolla una aplicación en un IDE, ya sea Visual Studio, Eclipse o Netbeans, si al escribir una sentencia, olvidamos un ";", hacemos referencia a una variable inexistente o utilizamos una sentencia incorrecta, se produce un error de codificación.
Cuando ocurre un error de codificación, el entorno nos proporciona información de donde se produce y como poder solucionarlo. El programa no puede compilarse hasta que el programador o programadora no corrija ese error.
El otro tipo de errores son lógicos, comúnmente llamados bugs, estos no evitan que el programa se pueda compilar con éxito, ya que no hay errores sintácticos, ni se utilizan variables no declaradas, etc.
Sin embargo, los errores lógicos, pueden provocar que el programa devuelva resultados erróneos, que no sean los esperados o pueden provocar que el programa termine antes de tiempo o no termine nunca.
Para solucionar este tipo de problemas, los entornos de desarrollo incorporan una herramienta conocida como depurador. El depurador permite supervisar la ejecución de los programas, para localizar y eliminar los errores lógicos.
Un programa debe compilarse con éxito para poder utilizarlo en el depurador. El depurador nos permita analizar todo el programa, mientras éste se ejecuta.
| Tipo de error | Manifestación | Forma de análisis |
|---|---|---|
| Error de codificación | El programa no puede compilarse | Información del entorno sobre dónde se produce y cómo solucionarlo |
| Error lógico | El programa compila, pero devuelve resultados erróneos o no termina | Supervisión de la ejecución mediante el depurador |
Funciones principales de un depurador
Puntos de interrupción
Los puntos de interrupción permiten a los programadores detener la ejecución de su código en puntos concretos para poder examinar el estado del programa en ese momento.
Los puntos de interrupción son instrucciones especiales que le indican al depurador que se detenga en una determinada línea de código. Esto permite al programador examinar los valores de las variables y el estado del programa en ese momento.
Ese punto donde indicamos que se pare la ejecución es lo que se denomina punto de ruptura, o breakpoint en inglés. El debugger detectará que en esa línea hay un punto de ruptura y cuando llegue a esa línea se parará la ejecución.
Los puntos de interrupción no tienen por qué ser fijos: muchos depuradores permiten vincular los breakpoints a ciertas condiciones individuales, lo cual permite detener el programa ante indicios concretos.
Si, por ejemplo, una serie de procesos se ejecuta correctamente 20 veces pero muestra un fallo de programa en la repetición número 21, el debugger podrá intervenir en el problema directamente si se ha configurado la condición adecuada. Así, los ciclos que se han realizado sin dar resultados no han de volver a ejecutarse.
Ejecución por pasos
La ejecución por pasos permite recorrer el código línea a línea, lo que ayuda a rastrear el flujo de ejecución e identificar dónde se producen los errores.
Los debuggers nos permiten que, en lugar de dejar que el código se ejecute hasta el final, ir línea por línea de tal manera que podemos controlar la ejecución del código al ritmo que deseamos.
Esto es útil cuando queremos saber, por ejemplo, qué valor tiene una variable antes de un punto en concreto y ver si ese valor es lo que esperamos, o si en un flujo condicional sigue el camino que deseamos que siga.
Step, step-into y step-out
Por defecto, cuando vamos a paso a paso en la depuración el depurador pasa por las funciones pero no llega a entrar en ellas. Para poder entrar en las funciones en lugar de un step hay que hacer un step-into.
De esta manera podremos entrar dentro de las funciones y ver paso a paso cómo se ejecutan. De la misma manera si estamos dentro de una función pero queremos salir de ésta para volver al flujo tenemos la opción de step-out que nos permite volver al punto donde se ejecutó la función.
Inspección de variables
La inspección de variables permite a los desarrolladores observar cómo cambian los valores de las variables en tiempo real mientras se ejecuta el programa, lo que ayuda a identificar errores lógicos.
La inspección de variables permite al programador ver los valores de las variables en tiempo de ejecución. Esto puede ayudar a identificar errores en la asignación de valores o el uso de variables.
El depurador nos permita analizar todo el programa, mientras éste se ejecuta. Permite suspender la ejecución de un programa, examinar y establecer los valores de las variables, comprobar los valores devueltos por un determinado método, el resultado de una comparación lógica o relacional, etc.
Análisis de la pila de llamadas
Los depuradores proporcionan una visión general de la pila de llamadas en cualquier punto de interrupción, mostrando a qué funciones se ha llamado y la cadena de ejecución actual.
Los debuggers observan el flujo de ejecución del programa que están depurando, y van guardando información del mismo como los valores de las variables o la pila de llamadas del proceso donde se va almacenando las llamadas a los métodos y/o funciones que se han ejecutado…
Análisis de memoria y registros
Otra de las funciones de los depuradores es el análisis de datos como, por ejemplo, el contenido de las variables, de las memorias o de los registros.
Los debuggers también pueden modificar las memorias como, por ejemplo, la memoria principal (memoria interna) o el registro del procesador.

Cómo funciona una sesión de depuración
Como usuario, se ha de comunicar a la herramienta sobre qué proceso ha de actuar: ya sea en forma de identificador o ID de proceso; o usando un nombre, en cuyo caso el depurador habrá de averiguar, en primer lugar, el ID correspondiente.
A continuación, se inicia la sesión de depuración mediante una llamada al sistema. Por lo general, la implementación de herramientas de depuración puede tomar dos enfoques diferentes.
- El proceso de detección de errores ocurre dentro del sistema en el que se ejecuta el software analizado.
- El proceso de detección de errores no se inicia en el mismo ordenador en el que se ejecuta el software analizado, sino en un sistema separado: este método se denomina depuración remota o remote debugging.
Los depuradores modernos, por lo general, son capaces de integrar en su búsqueda de errores cambios en el código fuente del software mientras este se ejecuta.
Este proceso de depuración just in time resulta especialmente útil en las fases tempranas del desarrollo de software, en las que es común que haya errores de cualquier envergadura en el código.
Proceso sistemático para depurar
Comience por identificar el error. ¿Cuál es el comportamiento inesperado que está observando? Ponga un punto de interrupción en el lugar donde cree que se produce el error.
Ejecute el código y observe los valores de las variables. Si no puede identificar el error, utilice otras técnicas de depuración, como el seguimiento de la ejecución o la inspección de variables.
A menudo, la depuración puede parecer desalentadora para los principiantes, pero siguiendo un enfoque sistemático, puedes hacer que el proceso sea más manejable.
- Reproducir el fallo: El primer paso es reproducir el problema. Comprender en qué condiciones aparece el fallo es crucial para localizar el problema.
- Comprender el código: Antes de sumergirte en la depuración, asegúrate de que comprendes el código y su finalidad. Esta comprensión ayuda a formular hipótesis sobre la causa del fallo.
- Aísla el problema: Intenta reducir la parte del código que está causando el problema. Esto podría implicar dividir el código en secciones más pequeñas o utilizar puntos de interrupción para detener la ejecución en puntos críticos.
- Utiliza instrucciones de impresión o un depurador: Insertar sentencias de impresión o utilizar una herramienta de depuración puede ayudar a inspeccionar los valores de las variables y el flujo de ejecución, señalando dónde van mal las cosas.
- Corrige y prueba: Una vez identificado el problema, realiza las correcciones necesarias y, a continuación, prueba rigurosamente para asegurarte de que la corrección resuelve el problema sin introducir nuevos errores.
Ejemplo de depuración de un bucle
En el siguiente caso, el código contiene un error lógico:
Código antes de depurar: for (int i=0; i<=10; i++) { System.out.println(i); }
Problema: Se supone que el bucle debe imprimir números del 1 al 10, pero en lugar de eso empieza por 0.
Pasos de la depuración:
- Detecta el error Aísla el fallo: El problema se encuentra en el inicio del bucle.
- Hipótesis. 2. Hipótesis: El contador del bucle debería empezar en 1, no en 0.
- Solución. Solución: Actualiza la inicialización de i a 1.
Código tras la depuración: for (int i=1; i<=10; i++) { System.out.println(i); }
En este ejemplo, se sigue un sencillo proceso de depuración para rectificar un error común, lo que demuestra cómo unos pasos sistemáticos pueden conducir a una solución eficaz de los problemas.
Ejemplo de depuración de una condición
En el código JavaScript anterior, se puede utilizar un depurador para establecer un punto de interrupción en la sentencia if para comprobar el valor de x y determinar por qué se ejecuta un determinado bloque de código.
La técnica del patito de goma
Además de lo anterior, se puede destacar la técnica de depuración de Patito de Goma, que consiste en explicar el código en voz alta a un objeto inanimado, como un patito de goma.
El nombre es una referencia a una historia del libro The Pragmatic Programmer en donde un programador toma un patito de goma y revisa su código forzándose a sí mismo a explicarlo, línea por línea, al pato.
La técnica del patito de goma funciona porque al verbalizar el código, el programador se ve obligado a pensar en él de una manera diferente. Esto puede ayudar a identificar errores en la lógica o en la estructura del código.
Este acto de verbalizar el problema y articular tu proceso de pensamiento a menudo ayuda a aclarar dónde puede haberse desviado la lógica, lo que conduce a una resolución más rápida del fallo.
Para aplicar la técnica del patito de goma, siga estos pasos:
- Encuentre un objeto inanimado con el que se sienta cómodo hablando. Puede ser un patito de goma, un peluche, una planta o cualquier otra cosa que le resulte útil.
- Comience a explicar su código en voz alta, línea por línea.
- Intente explicar lo que hace cada línea de código y cómo se relaciona con las demás.
- Si se encuentra con algo que no entiende, deténgase y piense en ello. ¿Por qué está escrito así? ¿Es la mejor manera de hacerlo?
- Siga explicando su código hasta que lo entienda completamente.

Ejemplos del depurador en la vida cotidiana
Existen algunas formas de aplicar los métodos de depuración de código para la vida cotidiana, los cuales pueden ser utilizados para resolver cualquier tipo de problemas.
Un estudiante que intenta entender matemáticas
Un estudiante está tratando de entender un concepto matemático. El estudiante puede explicar el concepto a un amigo o familiar.
Al verbalizar el concepto, el estudiante puede ver si lo entiende y si hay algún error en su razonamiento.
Este ejemplo aplica la técnica del patito de goma: la otra persona cumple la función de oyente, mientras que la explicación ordenada permite localizar el paso exacto en el que aparece la confusión.
Una línea de producción que funciona mal
Un gerente está tratando de determinar por qué una línea de producción está funcionando mal. El gerente puede utilizar un diagrama de flujo para representar el proceso de producción.
El gerente puede establecer puntos de interrupción en el diagrama para analizar el proceso a medida que se va ejecutando.
En la práctica, cada punto del diagrama permite detener el análisis y revisar qué estaba ocurriendo antes de que apareciera la anomalía, del mismo modo que un breakpoint detiene un programa en una línea concreta.
Un conductor que quiere ahorrar combustible
Un conductor está tratando de ahorrar combustible. El conductor puede utilizar un programa de seguimiento del kilometraje para ver cómo está utilizando su vehículo o también el conductor puede inspeccionar las variables del programa para ver si hay áreas en las que puede mejorar su eficiencia.
El kilometraje, el uso del vehículo y las áreas de mejora cumplen una función semejante a la inspección de variables: permiten observar datos concretos en lugar de basarse únicamente en impresiones.
Organizar una tarea que no sale bien
El mismo enfoque puede trasladarse a cualquier actividad dividida en pasos: primero se reproduce el problema, después se aísla la parte que falla, se formula una hipótesis, se modifica un solo elemento y se comprueba el resultado.
Cambiar varias cosas a la vez: Cuando depures, haz un cambio cada vez y pruébalo. Los cambios múltiples pueden dificultar la identificación de lo que arregló exactamente (o no arregló) el problema.
Arreglar los síntomas en lugar de las causas: Es esencial comprender la causa raíz de un fallo en lugar de limitarse a tratar sus síntomas. Este enfoque garantiza una solución a largo plazo.
Pasar por alto las soluciones sencillas: A veces, la solución es más sencilla de lo que parece. No pases por alto explicaciones sencillas en busca de otras complejas.
Depuradores frente a instrucciones de impresión
Seguramente te habrás preguntado qué te puede aportar un debugger que no te aporte añadir un console.log o un print en tu programa.
Si bien puede parecer que usar prints es mucho más fácil y rápido que depurar usando debuggers, las ventajas que aportan estas herramientas son muchas y nada despreciables.
- Mayor control: podemos controlar el flujo de ejecución para adaptarlo a nuestras necesidades.
- Mayor cantidad de información: Desde valores de variables hasta métodos ejecutados…
- No hay que modificar el código: Cuando añadimos un print modificamos nuestro código. La depuración en ningún momento modifica el código, lo cual hace que la información que muestra la herramienta represente el estado de la aplicación.
Utilizar los depuradores de forma eficiente significa equilibrar su uso con otras técnicas de depuración, como el registro, para evitar interrumpir excesivamente el flujo del desarrollo.
Tipos y ejemplos de depuradores
Python y PDB
Python, conocido por su sencillez y legibilidad, proporciona un depurador conocido como PDB (Python Debugger), que está integrado en su biblioteca estándar.
PDB ofrece funciones como establecer puntos de interrupción, recorrer el código, inspeccionar la pila y mucho más. Es especialmente fácil de usar para los principiantes debido a la sintaxis sencilla de Python y a los comandos sin complicaciones de PDB.
C++ con GDB y LLDB
Por otra parte, C++, famoso por su potencia y complejidad, utiliza varias herramientas de depuración como GDB (GNU Debugger) y LLDB (LLVM Debugger).
Estos depuradores están equipados para manejar las complejidades de los lenguajes compilados, ofreciendo funcionalidades avanzadas como la depuración remota, la detección de fugas de memoria y la depuración de aplicaciones multihilo.
A pesar de su pronunciada curva de aprendizaje, proporcionan una visión profunda de la ejecución de aplicaciones C++ complejas.
La elección entre PDB y GDB o LLDB a menudo se reduce a los requisitos del proyecto de desarrollo y a la familiaridad del desarrollador con la herramienta de depuración.
GNU gdb
El depurador estándar de GNU, gdb, es un debugger muy utilizado en entornos Unix. Sin interfaz gráfica de usuario, permite trazar la ejecución del programa y acceder a la tabla de símbolos del proceso para así depurar el código y poder analizarlo.
JavaScript y Chrome DevTools
El depurador de JavaScript, integrado en la mayoría de los navegadores y herramientas de desarrollo como Chrome DevTools, admite funciones como la edición en directo del código, el análisis del rendimiento y la depuración asíncrona.
Esta naturaleza integrada en el navegador proporciona una experiencia de depuración sin fisuras para el desarrollo web, permitiendo a los desarrolladores inspeccionar e interactuar con aplicaciones web en vivo directamente.
Navegadores como Firefox o Google Chrome tienen un debugger en las herramientas de desarrollador que permiten poder depurar nuestras aplicaciones web de la misma manera que podemos depurar programas escritos en otro lenguaje.
¿Sabías que también puedes utilizar depuradores JavaScript basados en navegador para depurar interactivamente aplicaciones Node.js? Esto es posible gracias a la bandera --inspect de Node.js, lo que demuestra la versatilidad de los depuradores de JavaScript.
Java y JDB
En cambio, el depurador de Java (JDB), que forma parte del Kit de Desarrollo de Java (JDK), destaca por proporcionar un entorno de depuración completo para aplicaciones independientes.
JDB admite la depuración a nivel de subprocesos, lo que permite a los desarrolladores gestionar eficazmente complejas aplicaciones multihilo.
Además, JDB se integra a la perfección con IDEs como Eclipse e IntelliJ IDEA, proporcionando una rica interfaz gráfica para las operaciones de depuración.
Depuradores integrados en IDE
Muchos entornos de desarrollo integrados (IDE) vienen con depuradores incorporados, lo que facilita a los desarrolladores depurar su código dentro del mismo entorno en el que lo escriben.
Normalmente la gran mayoría de IDEs (Eclipse, toda la familia Jetbrains…) llevan un debugger incorporado el cual permite la depuración de forma más amistosa que gdb.
Cada IDE incluye herramientas de depuración como: inclusión de puntos de ruptura, ejecución paso a paso de cada instrucción, ejecución por procedimiento, inspección de variables, etc.
Todo entorno de desarrollo, independientemente de la plataforma, así como del lenguaje de programación utilizado, suministra una serie de herramientas de depuración, que nos permiten verificar el código generado, ayudándonos a realizar pruebas tanto estructurales como funcionales.
Cuándo conviene utilizar un depurador
Los depuradores se utilizan con mayor eficacia durante la fase de desarrollo de un proyecto, sobre todo cuando se trata de aislar y corregir errores que hacen que el software se comporte de forma inesperada.
La clave de una depuración eficaz no es sólo encontrar dónde se produce el error, sino también comprender por qué ocurre.
- Al encontrar un error que produce salidas incorrectas o se bloquea.
- Analizar el flujo de un algoritmo complejo.
- Intentar comprender el comportamiento de código heredado o bibliotecas de terceros.
La utilidad de los depuradores y de la depuración en general es muy amplia. Siempre que un programa informático haya de funcionar a largo plazo y evitar errores en la medida de lo posible, no se puede prescindir de estas prácticas herramientas de análisis.
Ya se trate de programar, desarrollar o poner a prueba un código sencillo, un proceso aislado, un módulo, un programa complejo o todo un sistema operativo.
Prevención de errores
Las técnicas de depuración de código son una habilidad esencial para cualquier programador. Con la práctica, puede aprender a identificar y corregir errores de manera rápida y eficiente.
También es importante que los programadores comprendan la importancia de la prevención de errores. Esto significa escribir código claro y conciso, utilizar buenas prácticas de programación y realizar pruebas exhaustivas.
Los programadores que se centran en la prevención de errores pueden reducir significativamente el tiempo que necesitan para depurar su código.
Esto les permitirá dedicar más tiempo a desarrollar nuevas características y mejorar la calidad de su código.
Además, mantener un enfoque disciplinado para documentar y probar el código puede minimizar preventivamente los esfuerzos de depuración, garantizando la calidad del código desde el principio.
Apartarte regularmente de tu código durante breves descansos puede proporcionarte nuevas perspectivas, que a menudo te ayudarán a identificar los problemas más rápidamente cuando vuelvas.
tags: #depurador #informatica #ejemplos #vida #cuotidiana
Publicaciones populares:
- Cuándo sustituir el filtro de aire en el Kangoo 1.5 dCi
- Uso adecuado del hipoclorito para desinfección de alimentos
- Cómo dimensionar la depuradora para una piscina de 16.000 litros
- Guía de compra: agua destilada en Masymas
- Cómo limpiar y cuidar el filtro HEPA del Dyson V11
