Publicado: 16 de septiembre de 2024
Colaboradores: Camilo Quiroz-Vázquez

¿Qué es la depuración?

La depuración es el proceso de encontrar, aislar y resolver los errores de codificación conocidos como "bugs" o errores de software. La depuración ayuda a descubrir la causa de los errores de codificación, a evitar problemas de funcionamiento del software y a mejorar el rendimiento general del mismo.

Los errores de codificación, como los errores lógicos, los errores en tiempo de ejecución, los errores de sintaxis y los errores semánticos, pueden provocar bloqueos, outputs incorrectos o imprecisos, vulnerabilidades de seguridad y pérdida de datos. A diferencia de las pruebas de software, que permiten a los desarrolladores investigar los efectos de estos errores en el código fuente de un programa, la depuración busca la causa raíz y la corrección de estos errores.  

A través del proceso de depuración, los desarrolladores de software realizan análisis de causa raíz para asegurarse de que los errores que se encuentran en los programas informáticos se corrigen y no vuelven a ocurrir. Los errores pueden afectar de forma negativa a la estabilidad, la fiabilidad y la experiencia del usuario del software. Las herramientas y estrategias de depuración ayudan a optimizar el proceso de depuración.

El proceso de depuración

La depuración normalmente implica seis pasos:

- Reproducir las condiciones
- Encontrar el error
- Determinar la causa raíz
- Corregir el error
- Probar para validar la corrección
- Documentar el proceso

Paso 1: reproducir las condiciones
 

El proceso de depuración requiere especificidad; los ingenieros no pueden confiar en una descripción de segunda mano del problema para diagnosticarlo con precisión. Por lo tanto, el primer paso en el proceso de depuración es replicar las condiciones que causaron la aparición del error. La reproducción del error permite a los programadores e ingenieros observar el error de primera mano y recopilar datos contextuales para el resto del proceso de depuración.

Paso 2: encontrar el error
 

El próximo paso es identificar la fuente del error con la mayor precisión posible examinando minuciosamente el código y revisando todos los registros disponibles. Durante este paso, los desarrolladores generalmente confían en herramientas de depuración que facilitan la búsqueda en grandes fragmentos de código, en lugar de trabajar manualmente.

Paso 3: determinar la causa raíz
 

Los desarrolladores determinan qué causa un error examinando la lógica y el flujo del código y cómo interactúan los diferentes componentes del código en las condiciones específicas en las que se produce el error.

Paso 4: corregir el error
 

Este paso suele implicar la resolución de problemas y la revisión del código para rectificar el problema, así como volver a compilar y ejecutar el software para asegurarse de que se ha corregido el fallo. Estas revisiones pueden implicar varias iteraciones, ya que los primeros intentos pueden fallar o introducir inadvertidamente nuevos errores. 

La mayoría de los desarrolladores utilizan un sistema de control de versiones para realizar un seguimiento de los cambios, de modo que puedan deshacer fácilmente cualquier modificación que no resuelva el problema o cree otros nuevos. 

Paso 5: probar para validar la corrección
 

Las pruebas que se ejecutan después de corregir un error incluyen:

  • Pruebas unitarias, que prueban el segmento de código individual modificado para corregir el error
  • Pruebas de integración, que prueban todo el módulo que contiene el error corregido
  • Pruebas del sistema, que prueban todo el sistema en el que se ejecuta el módulo modificado
  • Pruebas de regresión, que garantizan que el código corregido no afecte al rendimiento de la aplicación, es decir, que la aplicación no haya retrocedido debido a la corrección del error.

Paso 6: documentar el proceso
 

Como último paso, los desarrolladores registran los detalles del proceso de reparación, incluida la causa del error, la forma en que se ha solucionado y cualquier otra información relevante. La documentación es una valiosa herramienta que los programadores pueden utilizar cuando se produzcan errores similares en el futuro.

Ejemplos de depuración

La comprensión de los tipos de fallos a los que se enfrenta un sistema permite a los ingenieros y desarrolladores de software encontrar la forma adecuada de corregir el código roto cuando surge un error. Estos son algunos ejemplos de errores comunes que requieren depuración:

Errores semánticos
 

Un fragmento de código que viola las reglas de un lenguaje de codificación provoca un error semántico. A diferencia de un error lógico, que produce un output incorrecto, un error semántico no producirá un output significativo.

Errores de sintaxis
 

Este error se produce cuando un desarrollador omite un elemento del código, como un paréntesis, una coma u otro error tipográfico. A diferencia de los lenguajes humanos escritos, en los que una frase con un error tipográfico puede entenderse, la falta de fragmentos de código provoca inmediatamente errores.

Errores lógicos
 

Este tipo de error incluye una sintaxis que es técnicamente correcta, pero tiene direcciones incorrectas que provocan un output no deseado. Debido a que la sintaxis es correcta, estos errores pueden ser difíciles de detectar. Cuando un sistema no se bloquea inmediatamente y la localización exacta del código incorrecto puede llevar mucho tiempo encontrarlo.

Errores de tiempo de ejecución
 

Estos errores se producen cuando una aplicación se está ejecutando o iniciando. Los errores de tiempo de ejecución pueden solucionarse ocasionalmente actualizando, reiniciando o reinstalando una aplicación. Otras veces pueden ser una señal de un programa que requiere más memoria o de otro tipo de error, como un error lógico.

Tipos de depuración

El proceso de depuración puede ser difícil y laborioso. La comprensión de varios enfoques del proceso de depuración puede hacer que la gestión de la tarea sea más eficaz.

Vuelta atrás
 

En este enfoque, los desarrolladores trabajan hacia atrás desde el punto en que se detectó el error para encontrar el origen del mismo. En concreto, vuelven a rastrear los pasos que siguió el programa con el código fuente problemático para ver dónde salieron mal las cosas. La vuelta atrás puede ser eficaz cuando se utiliza junto con un depurador.   

Eliminación de causas
 

Una técnica de depuración basada en hipótesis para eliminar causas requiere que el equipo especule sobre las causas del error y pruebe cada posibilidad de forma independiente. Este enfoque funciona mejor cuando el equipo está familiarizado con el código y las circunstancias que rodean el error.

Divide y vencerás
 

Al depurar bases de código grandes, los equipos pueden dividir las líneas de código en segmentos (funciones, módulos, métodos de clase u otras divisiones lógicas comprobables) y probar cada uno de ellos por separado para localizar el error. Cuando se identifique el segmento problemático, se puede dividir aún más y probar hasta que se identifique el origen del error.

Depuración de impresión y registro
 

La estrategia de depuración de impresión y registro consiste en añadir sentencias de impresión o "registros" al código para mostrar los valores de las variables, las pilas de llamadas, el flujo de ejecución y otra información relevante. Este enfoque es especialmente útil para depurar sistemas concurrentes o distribuidos en los que el orden de ejecución puede afectar al comportamiento del programa.

Depuración de pato de goma
 

En este enfoque, los desarrolladores "explican o hablan" del código, línea por línea, a cualquier objeto inanimado. La idea es que, al intentar explicar el código en voz alta, los desarrolladores puedan comprender mejor su lógica (o la falta de ella) y detectar errores con mayor facilidad.

Depuración automatizada
 

La depuración automatizada se basa en el análisis, la inteligencia artificial (IA) y los algoritmos de machine learning para automatizar uno o varios pasos del proceso de depuración. Las herramientas de depuración con IA pueden buscar en grandes conjuntos de código con mayor rapidez para identificar errores o acotar secciones de código que luego pueden ser examinadas más a fondo por un desarrollador.

Los sistemas automatizados pueden replicar líneas de código y automatizar pruebas para verificar que un sistema funciona según lo previsto. La automatización desempeña un papel importante tanto en la integración continua (IC) como en la entrega continua (EC), dos enfoques que aceleran las pruebas y la implementación de código nuevo.

Depuración de fuerza bruta
 

Generalmente implementada cuando otros métodos han fallado, la depuración por fuerza bruta implica recorrer todo el código base, línea por línea, para identificar el origen del problema. Este enfoque, que requiere mucho tiempo, también puede ser útil para depurar programas pequeños cuando el ingeniero o programador que realiza la depuración no está familiarizado con el código base.

 

Herramientas de depuración

Los depuradores son herramientas y API avanzadas que optimizan el desarrollo de software localizando errores de codificación en un sistema operativo o proceso de desarrollo de aplicaciones. Los depuradores representan un gran negocio en crecimiento. Con el panorama en constante expansión de las aplicaciones y programas informáticos y móviles, no es de extrañar que se prevea que el mercado mundial de depuradores crezca significativamente a finales de la década1.

Las empresas están invirtiendo millones en el desarrollo de sofisticadas herramientas de depuración (como chatbots de IA que pueden depurar código)2  y los investigadores universitarios están creando herramientas que pueden depurar videojuegos de forma autónoma3 y depurar lenguajes de programación específicos de dominio4.

Las herramientas y tecnologías pueden variar ampliamente en sus capacidades, pero esencialmente todas ofrecen interfaces de línea de comandos que ayudan a las organizaciones a encontrar y corregir problemas de errores. La mayoría también ofrece características de depuración remota y tutoriales que hacen que el software sea más accesible para los principiantes.

Algunos ejemplos de herramientas de depuración incluyen:

Entornos de desarrollo integrados (IDE)
 

Los IDE ofrecen a los programadores informáticos características completas para el desarrollo de software. Muchos IDE, como Visual Studio, Eclipse y PyCharm, vienen con un "modo de depuración". Estas herramientas de depuración integradas permiten a los desarrolladores ejecutar el código línea por línea (depuración por pasos), detener la ejecución del programa en puntos específicos (puntos de interrupción) y examinar el estado de las variables y la memoria en cualquier momento, entre otras capacidades. 

Los IDE también están disponibles como complementos de código abierto compatibles con una serie de lenguajes de programación como Java, Python, JavaScript y TypeScript y lenguajes de scripting como PHP.

Depuradores independientes
 

Los depuradores independientes como GNU Debugger (GDB) ofrecen características de depuración avanzadas, incluidos puntos de interrupción condicionales y puntos de observación. También facilitan la depuración inversa, que es cuando los programadores ejecutan un programa al revés. Tienden a ser más potentes y versátiles que los depuradores integrados en los IDE u otras herramientas de desarrolladores, pero también tienen una curva de aprendizaje más pronunciada para los usuarios y requieren más experiencia técnica. 

Utilidades de información de registro
 

Estas herramientas proporcionan formas de registrar el estado de un programa en varios puntos del código. A continuación, los registros se pueden analizar para encontrar anomalías o patrones problemáticos. La información de registro es útil para solucionar problemas de errores que se producen en entornos de producción, donde la depuración interactiva podría no ser factible. 

Analizadores de código estático
 

Las herramientas de análisis de código estático analizan el código sin ejecutarlo, buscando posibles errores  y corrigiendo fallos y desviaciones de las normas de codificación. En lugar de centrarse en la sintaxis (como hacen los intérpretes y los compiladores), estas herramientas analizan la semántica del código fuente, ayudando a los desarrolladores a detectar errores comunes de programación y a imponer estilos de codificación coherentes. 

Herramientas de análisis dinámico
 

Esencialmente lo contrario de los analizadores de código estático, las herramientas de análisis dinámico monitorizan el software mientras se ejecuta para detectar problemas como fugas de recursos o problemas de concurrencia. Esta herramienta ayuda a los equipos de desarrollo a detectar errores que el análisis estático puede pasar por alto, como pérdidas de memoria o desbordamientos de búfer.

Perfiladores de rendimiento
 

Los perfiladores de rendimiento permiten a los desarrolladores identificar los cuellos de botella de rendimiento en su código. Estos sistemas pueden medir el uso de la CPU, el uso de la memoria y las operaciones de E/S, lo que ayuda a localizar las operaciones lentas e ineficientes.

Depuración vs. pruebas

Las pruebas y la depuración son procesos complementarios en el desarrollo del nuevo código. Si bien sus resultados son diferentes, tanto las pruebas como la depuración se utilizan para producir código sin errores.

Las pruebas permiten a los desarrolladores de software entender lo que le ocurre a un sistema cuando se producen errores. Estas pruebas ayudan a los desarrolladores a saber cuándo un sistema ha fallado y los efectos que el fallo puede tener en un software. Las pruebas automatizadas permiten a los desarrolladores realizar pruebas continuas con el código nuevo para obtener conocimientos sobre varios escenarios. Las pruebas son una parte clave del desarrollo de software, pero no explican por qué se ha producido un error.

Las estrategias y herramientas de depuración son las que utilizan los desarrolladores para encontrar la causa raíz de los errores, corregirlos y documentarlos para evitar que se repitan. Cuando se utilizan juntas, la depuración y las pruebas ayudan a los equipos a crear un enfoque simplificado para desarrollar código y crear mejores productos de software.

Soluciones relacionadas
IBM Instana Observability

La plataforma Instana Observability proporciona datos de rendimiento en tiempo real, completos con todo el contexto, para todos sus equipos. La visibilidad de pila completa automatizada, la granularidad de 1 segundo y los 3 segundos para notificar permiten una identificación rápida para prevenir y remediar problemas.

Explore IBM Instana Observability Solicite una demo de IBM Instana
IBM bonomic

La plataforma de optimización de costes de nube híbrida IBM Turbonomic le permite automatizar continuamente y en tiempo real las acciones cruciales que garantizan que sus aplicaciones hagan un uso eficiente de sus recursos informáticos, de almacenamiento y de red, en cada capa de la pila. 

Explore IBM Turbonomic Pruebe Turbonomic gratis
IBM Cloud Pak for AIOps

Obtenga visibilidad de los datos y las dependencias en todos los entornos de TI con herramientas con IA que le ayudarán a abordar la gestión y corrección de incidencias.

Explorar IBM Cloud Pak for AIOps Realice una visita autoguiada
Dé el siguiente paso

IBM Debug for z/OS ofrece cobertura de depuración y código para aplicaciones de z/OS escritas en COBOL, PL/I, C/C++ y Assembler.

IBM Debug para z/OS
Notas a pie de página

1 "Global software debugging market analysis 2023-2030" [Análisis del mercado mundial de depuración de software 2023-2030]. Benzinga. 5 de septiembre de 2022.
2 "Google’s Bard AI chatbot can now generate and debug code" [El chatbot Bard AI de Google ya puede generar y depurar código]. TechCrunch+. 12 de abril de 2023.
3 "Autonomously debugging video games" [Depuración autónoma de videojuegos]. Facultad de Ingeniería de la Universidad del Sur de California-Viterbi. 5 de abril de 2023.
4 "An easier way to get bugs out of programming languages" [Una forma más sencilla de eliminar errores de los lenguajes de programación]. MIT News. 7 de abril de 2023.