Punto de interrupción

En el desarrollo de software, un punto de interrupción es un lugar de parada o pausa intencional en un programa, implementado con fines de depuración. A veces también se le denomina simplemente pausa.
De manera más general, un punto de interrupción es un medio para adquirir conocimientos 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 determinar si el programa está funcionando como se esperaba. En la práctica, un punto de interrupción consta de una o más condiciones que determinan cuándo se debe interrumpir la ejecución de un programa.
Historia
Los puntos de interrupción fueron inventados para ENIAC, una de las primeras computadoras digitales, por la programadora Betty Holberton. En el diseño inicial de ENIAC, el flujo del programa se establecía conectando cables de una unidad a otra. Para que el programa se detuviera en un punto determinado, se retiraba un cable, llamado punto de interrupción.
Tipos de puntos de interrupción
Puntos de interrupción de la máquina
Las primeras computadoras mainframe, como la IBM/360, tenían interruptores/dials de consola que permitían puntos de interrupción en direcciones de almacenamiento de instrucciones específicas y proporcionaban un ciclo único. funcionamiento, permitiendo observar el contenido de los registros y la memoria directamente en las luces de la consola. La llegada de la multitarea limitó el uso de esta opción ya que se detuvo toda la máquina.
Puntos de interrupción no interactivos
Los programadores han utilizado parches de código de máquina para implementar puntos de interrupción destructivos únicos para provocar un volcado del núcleo desde los primeros días de las computadoras. El volcado de memoria proporcionó el estado de los registros y la memoria en el momento exacto del "bloqueo" deliberado.
Puntos de interrupción interactivos
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 monitores de vídeo ubicuos conectados a mainframes que la depuración de pantalla completa totalmente interactiva en entornos multitarea se convirtió en una realidad. Esto también permitió la ejecución del programa paso a paso en una verdadera animación del programa con alteraciones opcionales de registro y memoria mostradas simultáneamente. Inicialmente, este tipo de animación estaba en el nivel de código de máquina desensamblado o descompilado, pero luego avanzó a la animación a nivel de fuente HLL.
Puntos de interrupción condicionales
Los puntos de interrupción se utilizan más comúnmente para interrumpir un programa en ejecución inmediatamente antes de la ejecución de una instrucción especificada por el programador. A esto se le suele denominar 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. A esto se le suele denominar punto de interrupción de datos o punto de observación. Muchos sistemas también admiten puntos de interrupción que solo están activos si se cumple una condición (como una variable que tiene un valor determinado), generalmente denominados punto de interrupción condicional.
Herramientas de inspección
Cuando se alcanza un punto de interrupción, se utilizan varias herramientas para inspeccionar el estado del programa o modificarlo. El seguimiento de la pila de cada subproceso se puede utilizar para ver la cadena de llamadas a funciones que condujeron 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, módulos de programa cargados y otra información.
Puntos de registro
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. Generalmente el desarrollador puede especificar un mensaje y/o valores de variables para imprimir cuando la ejecución llega a un punto específico. Los puntos de registro son una alternativa a colocar declaraciones de registro en el programa que se está depurando (a veces llamado depuración printf) y son particularmente útiles cuando cambiar el programa no es práctico (por ejemplo, cuando se depura una biblioteca externa llamada por el programa).
Implementaciones
Hardware
Muchos procesadores incluyen soporte de hardware para puntos de interrupción (normalmente puntos de interrupción de instrucciones y datos). Como 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 rama. Este tipo de limitación viene impuesta por la microarquitectura del procesador y varía de un procesador a otro.
Software
Sin soporte de hardware (y en entornos multitarea), los depuradores tienen que implementar puntos de interrupción en el software. Para puntos de interrupción de instrucciones, esta es una tarea comparativamente simple de reemplazar la instrucción en la ubicación del punto de interrupción por:
- una instrucción que llama al depurador directamente (por ejemplo, una llamada del sistema, o int3 en caso de x86) o
- una instrucción inválida que hace que un programa deliberado interrumpa (que luego es interceptado / manejado por el depurador)
Esta técnica puede ser más difícil de implementar en sistemas multitarea que utilizan almacenamiento de programas compartidos (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,
- un simulador de conjunto de instrucciones puede implementar puntos de ruptura incondicionales o condicionales, simplemente incrustando las pruebas de condición apropiadas dentro de su propio ciclo de programa normal – que también permite naturalmente puntos de ruptura no invasivos (por ejemplo, en programas solo lectura).
- Los idiomas interpretados pueden utilizar eficazmente el mismo concepto que anteriormente en su ciclo de programas.
- "Instrumentar" todo el código fuente con declaraciones de fuentes adicionales que emiten una función que invoca una subrutina de depuración interna o externa, es otro enfoque común. Este método aumenta el tamaño binario y podría afectar negativamente a la asignación de memoria normal y los manipuladores de excepción. Existen opciones de "Debug" en algunos compiladores para implementar esta técnica semi-transparentemente.
Algunos depuradores permiten modificar registros o variables de programa en la memoria antes de continuar, lo que permite efectivamente la introducción de archivos "codificados a mano" asignaciones temporales con fines de prueba. De manera similar, las instrucciones del programa a menudo se pueden omitir 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 oscuros sistemas "basados en eventos" subrutinas de error que rara vez, o nunca, se ejecutan, sin el riesgo adicional de dejar cambios temporales en el origen. Se puede cambiar manualmente la ubicación del currículum dentro de un programa en pausa 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 utiliza recursos adicionales en el mismo procesador. 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), y también reduce las pérdidas de caché.
Algunas implementaciones de lenguajes de programación exponen sus funciones de depuración para que las utilicen otros programas.
Por ejemplo, algunos dialectos FORTRAN tienen una instrucción AT
, que originalmente estaba destinada a actuar como un punto de interrupción de instrucción.
Python implementa un depurador accesible desde un programa Python.
Se puede abusar de estas instalaciones para que actúen como la declaración COMEFROM.