En el desarrollo de software , un punto de interrupción es un punto de parada o pausa intencional en un programa , que se coloca con fines de depuración . A veces también se lo denomina simplemente pausa .
En términos más generales, un punto de interrupción es un medio para adquirir conocimiento sobre un programa durante su ejecución. Durante la interrupción , el programador inspecciona el entorno de prueba ( registros de propósito general , memoria , registros, archivos , etc.) para averiguar si el programa está funcionando como se espera. En la práctica, un punto de interrupción consiste en una o más condiciones que determinan cuándo se debe interrumpir la ejecución de un programa.
Los puntos de interrupción fueron inventados para ENIAC , una de las primeras computadoras digitales, por la programadora Betty Holberton . [1] En el diseño inicial de ENIAC, el flujo del programa se establecía conectando cables de una unidad a otra. Para hacer que el programa se detuviera en un punto determinado, se quitaba un cable, llamado punto de interrupción . [2]
Los primeros ordenadores mainframe, como el IBM/360 , tenían interruptores o diales de consola que permitían establecer puntos de interrupción en direcciones de almacenamiento de instrucciones específicas y proporcionaban un funcionamiento de "ciclo único", lo que permitía observar directamente el contenido de los registros y la memoria en las luces de la consola. La llegada de la multitarea limitó el uso de esta opción, ya que se detenía toda la máquina.
Los programadores han utilizado parches de código de máquina para implementar puntos de interrupción destructivos individuales que provoquen un volcado de memoria desde los primeros tiempos de las computadoras. El volcado de memoria proporcionaba el estado de los registros y la memoria en el momento exacto del "bloqueo" deliberado.
La llegada de las consolas de teletipo en la década de 1960 permitió capacidades de depuración de línea de comandos más interactivas , pero no fue hasta principios de la década de 1970 y la llegada de los omnipresentes monitores de vídeo conectados a los mainframes que la depuración totalmente interactiva y a pantalla completa en entornos multitarea se convirtió en una realidad. Esto también permitió la ejecución de programas paso a paso en un modo de verdadera animación de programas con modificaciones opcionales de registros y memoria mostradas simultáneamente. Inicialmente, este tipo de animación se encontraba al nivel de código de máquina desensamblado o descompilado , pero más tarde avanzó a la animación de nivel de fuente HLL .
Los puntos de interrupción se utilizan con mayor frecuencia para interrumpir un programa en ejecución inmediatamente antes de la ejecución de una instrucción especificada por el programador . Esto se conoce a menudo como punto de interrupción de instrucción .
También se pueden utilizar otros tipos de condiciones, como la lectura, escritura o modificación de una ubicación específica en un área de la memoria. Esto se suele denominar punto de interrupción de datos o punto de vigilancia . Muchos sistemas también admiten puntos de interrupción que solo están activos si se cumple una condición (como que una variable tenga un valor determinado), normalmente denominados puntos de interrupción condicionales . [3]
Cuando se alcanza un punto de interrupción, se utilizan varias herramientas para inspeccionar el estado del programa o modificarlo. Se puede utilizar el seguimiento de la pila de cada subproceso para ver la cadena de llamadas de función que llevaron a la instrucción pausada. Una lista de relojes permite ver los valores de las variables y expresiones seleccionadas . También puede haber herramientas para mostrar el contenido de los registros , los módulos de programa cargados y otra información.
Un punto de registro es un tipo de punto de interrupción que solo imprime (o "registra" ) información en lugar de interrumpir la ejecución. Por lo general, el desarrollador puede especificar un mensaje y/o valores de variables para imprimir cuando la ejecución llega a un punto específico. [4] Los puntos de registro son una alternativa a colocar instrucciones de registro en el programa que se está depurando (a veces llamado printf debugging ), y son particularmente útiles cuando no es práctico cambiar el programa (por ejemplo, cuando se depura una biblioteca externa llamada por el programa).
Muchos procesadores incluyen soporte de hardware para puntos de interrupción (normalmente puntos de interrupción de instrucciones y datos). Por ejemplo, la arquitectura del conjunto de instrucciones x86 proporciona soporte de hardware para puntos de interrupción con sus registros de depuración x86 . Dicho hardware puede incluir limitaciones, por ejemplo, no permitir puntos de interrupción en instrucciones ubicadas en ranuras de retardo de bifurcación . Este tipo de limitación la impone la microarquitectura del procesador y varía de un procesador a otro.
Sin soporte de hardware (y en entornos multitarea), los depuradores tienen que implementar puntos de interrupción en el software. Para los puntos de interrupción de instrucciones, esta es una tarea relativamente simple que consiste en reemplazar la instrucción en la ubicación del punto de interrupción por:
Esta técnica puede ser más difícil de implementar en sistemas multitarea que utilizan almacenamiento de programa compartido (la interrupción puede ocurrir en un subproceso diferente, lo que requiere la resurrección de la instrucción original para ese subproceso). Además, si el programa reside en la memoria protegida, se puede evitar la sobrescritura de instrucciones.
Alternativamente,
Algunos depuradores permiten modificar registros o variables de programa en memoria antes de reanudar, lo que permite introducir asignaciones temporales "codificadas a mano" con fines de prueba. De manera similar, a menudo se pueden omitir las instrucciones del programa para determinar el efecto de los cambios en la lógica del programa, lo que permite responder preguntas sobre la ejecución del programa de manera directa (es decir, sin suposiciones ni conjeturas). En muchos casos, puede ser el único método práctico para probar subrutinas de error "controladas por eventos" poco conocidas que rara vez se ejecutan, o nunca, sin el riesgo adicional de dejar cambios temporales en el código fuente. El cambio manual de la ubicación de reanudación dentro de un programa pausado se puede utilizar para ingresar una sección de código que de otro modo rara vez se ejecutaría (como un controlador de condición de hardware específico).
Sin embargo, la implementación de puntos de interrupción de datos en el software puede reducir en gran medida el rendimiento de la aplicación que se está depurando, ya que está utilizando recursos adicionales en el mismo procesador. [5] Sin embargo, esto normalmente es aceptable durante las pruebas y la cantidad de información disponible del depurador no está restringida por las limitaciones de los datos de depuración conocidos por el hardware. Por ejemplo, una implementación de software puede recopilar datos de ruta lógica a nivel de programa/subrutina/instrucción para aumentar considerablemente lo que podría almacenar la plataforma de hardware particular para su inspección. El método de simulación del conjunto de instrucciones reduce considerablemente la sobrecarga, en comparación con el método de reemplazo de instrucciones (repetidas), reduciendo también las fallas de caché .
Algunas implementaciones de lenguajes de programación exponen sus funciones de depuración para que otros programas las utilicen. Por ejemplo, algunos dialectos de FORTRANAT
tienen una declaración que originalmente estaba destinada a actuar como un punto de interrupción de instrucciones. Python implementa un depurador accesible desde un programa Python. [6]
Estas funciones pueden ser y son [7] abusadas para actuar como la declaración COMEFROM .