Articulo de referencia

Punto de ruptura

Interfaz de depuración de Eclipse con un programa suspendido en un punto de interrupción. Se pueden ver los paneles con el rastreo de la pila (arriba a la izquierda) y las varia...

Interfaz de depuración de Eclipse con un programa suspendido en un punto de interrupción. Se pueden ver los paneles con el rastreo de la pila (arriba a la izquierda) y las variables observadas (arriba a la derecha).

En el desarrollo de software , un punto de interrupción es un lugar intencional para detener o pausar un programa , establecido con fines de depuración . A veces también se le denomina simplemente pausa .

En términos generales, un punto de interrupción es un medio para obtener información sobre un programa durante su ejecución. Durante la interrupción , el programador inspecciona el entorno de prueba ( registros de propósito general , memoria , archivos de registro , etc.) para determinar si el programa funciona como se espera. En la práctica, un punto de interrupción consta de una o más condiciones que determinan cuándo debe interrumpirse 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 . [ 1 ] 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 . [ 2 ]

Tipos de puntos de interrupción

Puntos de interrupción de la máquina

Las primeras computadoras centrales, como la IBM/360 , contaban con interruptores/selectores 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 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 la máquina completa se detenía.

Puntos de interrupción no interactivos

Desde los inicios de la informática , los programadores han utilizado parches de código máquina para implementar puntos de interrupción destructivos que provocan un volcado de memoria . Este volcado proporcionaba el estado de los registros y la memoria en el momento exacto del fallo provocado.

puntos de interrupción interactivos

La aparición de las consolas de teletipo en la década de 1960 permitió una mayor interactividad en la depuración mediante línea de comandos, pero no fue hasta principios de la década de 1970, con la llegada de los monitores de vídeo omnipresentes conectados a los ordenadores centrales , que la depuración totalmente interactiva a pantalla completa en entornos multitarea se convirtió en una realidad. Esto también permitió la ejecución paso a paso de programas mediante una auténtica animación , con la visualización simultánea de las modificaciones de registros y memoria. Inicialmente, este tipo de animación se realizaba a nivel de código máquina desensamblado o descompilado , pero posteriormente evolucionó hasta la animación a nivel de código fuente HLL .

Puntos de interrupción condicionales

Los puntos de interrupción se utilizan con mayor frecuencia para interrumpir un programa en ejecución justo antes de la ejecución de una instrucción especificada por el programador . Esto se conoce comúnmente 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 memoria. Esto se conoce comúnmente como punto de interrupción de datos o punto de observación . Muchos sistemas también admiten puntos de interrupción que solo se activan si se cumple una condición (como que una variable tenga un valor determinado), generalmente denominados puntos de interrupción condicionales . [ 3 ]

Herramientas de inspección

Cuando se alcanza un punto de interrupción, se utilizan diversas herramientas para inspeccionar el estado del programa o modificarlo. El rastreo de pila de cada hilo permite visualizar la secuencia de llamadas a funciones que condujeron a la instrucción pausada. Una lista de variables observadas permite ver los valores de las variables y expresiones seleccionadas . También existen herramientas para mostrar el contenido de los registros , los 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. 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 insertar instrucciones de registro en el programa que se está depurando (a veces llamado depuración con printf ), y son particularmente útiles cuando no es práctico modificar el programa (por ejemplo, al depurar 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). Por ejemplo, la arquitectura del conjunto de instrucciones x86 proporciona soporte de hardware para puntos de interrupción mediante sus registros de depuración x86 . Este hardware puede presentar limitaciones, como no permitir puntos de interrupción en instrucciones ubicadas en ranuras de retardo de bifurcación . 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 deben implementar puntos de interrupción en el software. Para los puntos de interrupción de instrucciones, esta es una tarea relativamente sencilla que consiste en reemplazar la instrucción en la ubicación del punto de interrupción por:

  • una instrucción que llama directamente al depurador (por ejemplo, una llamada al sistema o int3 en el caso de x86 ) o
  • una instrucción no válida que provoca una interrupción deliberada del programa (que luego es interceptada/manejada por el depurador)

Esta técnica puede ser más difícil de implementar en sistemas multitarea que utilizan almacenamiento de programas compartido (la interrupción puede ocurrir en un hilo diferente, lo que requiere recuperar la instrucción original para ese hilo). Además, si el programa reside en memoria protegida, la sobrescritura de instrucciones puede verse impedida.

Alternativamente,

Algunos depuradores permiten modificar registros o variables de programa en memoria antes de reanudar la ejecución, lo que posibilita la introducción de asignaciones temporales "codificadas manualmente" con fines de prueba. Del mismo modo, a menudo se pueden omitir instrucciones del programa para determinar el efecto de los cambios en la lógica del programa, lo que permite responder directamente a preguntas sobre la ejecución del programa (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, o nunca, se ejecutan, sin el riesgo adicional de dejar cambios temporales en el código fuente. Cambiar manualmente la ubicación de reanudación dentro de un programa pausado puede utilizarse para acceder a 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 considerablemente el rendimiento de la aplicación que se está depurando, ya que utiliza recursos adicionales en el mismo procesador. [ 5 ] No obstante, esto suele ser 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 en 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 (repetido), reduciendo también los fallos 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 instrucción que originalmente estaba destinada a funcionar como un punto de interrupción de instrucciones. Python implementa un depurador accesible desde un programa Python. [ 6 ] Estas herramientas pueden ser [ 7 ] utilizadas indebidamente para funcionar como la instrucción COMEFROM .

Véase también

Referencias

  1. Abbate, Janet (2012), Recoding Gender: Women's Changing Participation in Computing , MIT Press, p.  32, ISBN 9780262018067
  2. Thomas Haigh; Mark Priestley; Crispen Rope (2016). ENIAC en acción: Creando y rehaciendo la computadora moderna . MIT Press. pág. 153. ISBN  978-0-262-03398-5.
  3. "Preguntas frecuentes: ¿Cómo establezco un punto de interrupción condicional?" . Wiki de Eclipse . Consultado el 19 de abril de 2023 .
  4. Walsh, David (22 de marzo de 2021). "¡Usa Logpoints!" . Blog de David Walsh . Consultado el 19 de abril de 2023 .
  5. GDB Internals Archivado el 29 de noviembre de 2011 en Wayback Machine
  6. Referencia de la biblioteca de Python: El depurador de Python. Archivado el 13 de septiembre de 2008 en Wayback Machine .
  7. entrian.com – goto y comefrom para Python