Todo el que aprende a programar se encuentra a menudo con el término debugging. Este proceso, que en español se conoce como de­pu­ra­ción, es un análisis exhau­s­ti­vo del código fuente de un programa in­fo­r­má­ti­co que tiene como objetivo ide­n­ti­fi­car posibles errores. Por ello, si quieres ase­gu­rar­te de que el software que de­sa­rro­llas funcione ade­cua­da­me­n­te en todas las pla­ta­fo­r­mas y di­s­po­si­ti­vos para los que está pensado, no dudes en aplicar un depurador. En este artículo te contamos qué es exac­ta­me­n­te un depurador, cómo funcionan estos programas tan útiles y en qué ámbitos se usan.

¿Qué es un depurador?

Un depurador es un programa que permite detectar y dia­g­no­s­ti­car fallos en programas in­fo­r­má­ti­cos. El objetivo de estas he­rra­mie­n­tas es ga­ra­n­ti­zar, a largo plazo, que el software funcione en todos los di­s­po­si­ti­vos y pla­ta­fo­r­mas para los que está pensado. Por este motivo, muchos de­pu­ra­do­res no solo analizan el código fuente del programa, sino también su in­ter­ac­ción con el sistema operativo que lo ejecuta y con los elementos de hardware. El proceso de de­pu­ra­ción o debugging ocurre mientras el programa se ejecuta, de forma que no es necesario cerrarlo para llevar a cabo el análisis.

Nota

El término de­pu­ra­ción o debugging describe el proceso de detección de fallos de software. No se usa ex­clu­si­va­me­n­te para describir lo que realiza un depurador o debugger, sino también para referirse a la búsqueda de errores mediante otros métodos.

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 de­sa­rro­llo de software para hacer re­fe­re­n­cia a errores de todo tipo en los programas. De hecho, ya se usaba entre in­ge­nie­ros en el siglo XIX para describir fallos de fu­n­cio­na­mie­n­to. Por este motivo, la co­rre­c­ción de los errores de software se denomina también bugfix.

De­fi­ni­ción

Los de­pu­ra­do­res o debuggers son programas in­fo­r­má­ti­cos que facilitan a los de­sa­rro­lla­do­res la tarea de buscar errores en el software. Gracias a ellos, los errores de­te­c­ta­dos durante la de­pu­ra­ción o debugging, también llamados bugs, pueden co­rre­gi­r­se fá­ci­l­me­n­te. Esto, a su vez, permite ga­ra­n­ti­zar el buen fu­n­cio­na­mie­n­to del software a largo plazo.

¿Qué funciones realiza un depurador?

Puesto que ningún software está to­ta­l­me­n­te libre errores, la op­ti­mi­za­ción diaria es una tarea im­pre­s­ci­n­di­ble. El verdadero problema en este sentido no suele ser la ide­n­ti­fi­ca­ción de procesos erróneos en la ejecución, sino la de su causa concreta. Basta un pa­ré­n­te­sis mal colocado, por ejemplo, o un operador usado de forma in­co­rre­c­ta, pera que el programa deje de funcionar como debería. Sin embargo, cuando hay que lidiar con cientos o miles de líneas, con la búsqueda manual carácter a carácter no se obtienen muchos frutos. Los de­pu­ra­do­res modernos, en cambio, no solo informan de que se ha en­co­n­tra­do un problema, sino que también dan datos de­ta­lla­dos acerca del tipo de error y, a menudo, también indican en qué línea de código se encuentra.

Por lo general, los de­pu­ra­do­res analizan el código del software paso a paso. Para ello, en el software se es­ta­ble­cen los llamados brea­k­poi­nts o puntos de in­te­rru­p­ción. El depurador re­co­no­ce­rá estos puntos y los usará para detener la ejecución del software pre­ci­sa­me­n­te en dichos lugares. Los de­sa­rro­lla­do­res tienen entonces dos opciones:

  • Pueden examinar el estado del programa en ese momento en concreto. De esta forma pueden comprobar fá­ci­l­me­n­te, por ejemplo, si todas las variables im­pli­ca­das han dado como resultado los valores esperados.
     
  • También pueden ejecutar el programa a partir del punto de in­te­rru­p­ción para descartar posibles problemas o causas de error.

Los puntos de in­te­rru­p­ción no tienen por qué ser fijos: muchos de­pu­ra­do­res permiten vincular los brea­k­poi­nts a ciertas co­n­di­cio­nes in­di­vi­dua­les, lo cual permite detener el programa ante indicios concretos. Si, por ejemplo, una serie de procesos se ejecuta co­rre­c­ta­me­n­te 20 veces pero muestra un fallo de programa en la re­pe­ti­ción número 21, el debugger podrá in­te­r­ve­nir en el problema di­re­c­ta­me­n­te si se ha co­n­fi­gu­ra­do la condición adecuada. Así, los ciclos que se han realizado sin dar re­su­l­ta­dos no han de volver a eje­cu­tar­se.

Otra de las funciones de los de­pu­ra­do­res 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 pro­ce­sa­dor.

¿Cómo se utilizan los de­pu­ra­do­res?

La manera de im­ple­me­n­tar un depurador para ide­n­ti­fi­car errores de software dependerá, por un lado, del tipo de debugger en concreto y, por otro, del sistema operativo en el que se ejecute el software analizado (y el depurador). Como usuario, se ha de comunicar a la he­rra­mie­n­ta sobre qué proceso ha de actuar: ya sea en forma de ide­n­ti­fi­ca­dor o ID de proceso; o usando un nombre, en cuyo caso el depurador habrá de averiguar, en primer lugar, el ID co­rre­s­po­n­die­n­te. A co­n­ti­nua­ción, se inicia la sesión de de­pu­ra­ción mediante una llamada al sistema.

Por lo general, la im­ple­me­n­ta­ción de he­rra­mie­n­tas de de­pu­ra­ción puede tomar dos enfoques di­fe­re­n­tes:

  • 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 de­pu­ra­ción remota o remote debugging.

Los de­pu­ra­do­res 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 de­pu­ra­ción just in time resulta es­pe­cia­l­me­n­te útil en las fases tempranas del de­sa­rro­llo de software, en las que es común que haya errores de cualquier en­ve­r­ga­du­ra en el código. No en vano, los entornos de de­sa­rro­llo de di­fe­re­n­tes lenguajes de pro­gra­ma­ción y de fra­me­wo­r­ks disponen también de un depurador integrado.

De­pu­ra­do­res: ¿dónde se usan?

La utilidad de los de­pu­ra­do­res y de la de­pu­ra­ción en general es muy amplia. Siempre que un programa in­fo­r­má­ti­co haya de funcionar a largo plazo y evitar errores en la medida de lo posible, no se puede pre­s­ci­n­dir de estas prácticas he­rra­mie­n­tas de análisis: ya se trate de programar, de­sa­rro­llar o poner a prueba un código sencillo, un proceso aislado, un módulo, un programa complejo o todo un sistema operativo.

Tampoco es necesario ser pro­gra­ma­dor para apro­ve­char los be­ne­fi­cios de aplicar el debugger adecuado a un programa in­fo­r­má­ti­co. Si se diseña y se configura de forma adecuada, un depurador puede, por ejemplo, funcionar como canal de co­mu­ni­ca­ción entre los usuarios del programa y los de­sa­rro­lla­do­res en caso de que se produzcan fallos de fu­n­cio­na­mie­n­to. Gracias a los informes del depurador, los de­sa­rro­lla­do­res pueden co­m­pre­n­der más fá­ci­l­me­n­te cuál es el problema y cómo el usuario podría so­lu­cio­nar­lo en el software. Según el programa concreto, el depurador y la gravedad del problema, una he­rra­mie­n­ta de de­pu­ra­ción integrada podría incluso hacer posible que los usuarios reparasen los errores por sí mismos.

Ir al menú principal