El término error , en el sentido de defecto, se remonta al menos a 1878, cuando Thomas Edison escribió "pequeños fallos y dificultades" en sus inventos como "Bichos".
Una historia popular de la década de 1940 es de la almirante Grace Hopper . [1] Mientras trabajaba en una computadora Mark II en la Universidad de Harvard, sus asociados descubrieron una polilla atrapada en un relé que impedía la operación y escribieron en un libro de registro "Primer caso real de un error encontrado". Aunque probablemente sea una broma , combinando los dos significados de error (biológico y defecto), la historia indica que el término se usaba en el campo de la informática en ese momento.
De igual forma, el término depuración se utilizaba en la aeronáutica antes de adentrarse en el mundo de la informática. Una carta de J. Robert Oppenheimer , director del Proyecto Manhattan de la bomba atómica de la Segunda Guerra Mundial en Los Alamos, utilizó el término en una carta al Dr. Ernest Lawrence en UC Berkeley, fechada el 27 de octubre de 1944, [2] en relación con el reclutamiento de personal técnico adicional. personal. La entrada del Oxford English Dictionary para depuración utiliza el término depuración en referencia a las pruebas de motores de aviones en un artículo de 1945 en el Journal of the Royal Aeronautical Society. Un artículo en "Airforce" (junio de 1945, p. 50) se refiere a la depuración de cámaras de aviones.
El artículo fundamental de Gill [3] de 1951 es la primera discusión en profundidad sobre los errores de programación, pero no utiliza el término error o depuración .
En la biblioteca digital de la ACM , el término depuración se utiliza por primera vez en tres artículos de las Reuniones Nacionales de la ACM de 1952. [4] [5] [6] Dos de los tres utilizan el término entre comillas.
En 1963, depuración era un término lo suficientemente común como para mencionarlo de pasada sin explicación en la página 1 del manual CTSS . [7]
Alcance
A medida que el software y los sistemas electrónicos se han vuelto más complejos, las diversas técnicas de depuración comunes se han ampliado con más métodos para detectar anomalías, evaluar el impacto y programar parches de software o actualizaciones completas de un sistema. Las palabras "anomalía" y "discrepancia" pueden usarse, como términos más neutrales , para evitar las palabras "error" y "defecto" o "error", donde podrían implicar que todos los llamados errores , defectos o fallas. debe arreglarse (a toda costa). En cambio, se puede realizar una evaluación de impacto para determinar si los cambios para eliminar una anomalía (o discrepancia ) serían rentables para el sistema, o tal vez una nueva versión programada podría hacer que los cambios sean innecesarios. No todos los problemas son críticos para la seguridad o la misión en un sistema. Además, es importante evitar la situación en la que un cambio pueda ser más molesto para los usuarios, a largo plazo, que vivir con los problemas conocidos (donde "la cura sería peor que la enfermedad"). Basar las decisiones en la aceptabilidad de algunas anomalías puede evitar una cultura de mandato de "cero defectos", donde la gente podría verse tentada a negar la existencia de problemas para que el resultado parezca cero defectos . Teniendo en cuenta las cuestiones colaterales, como la evaluación de impacto de costo versus beneficio, se expandirán técnicas de depuración más amplias para determinar la frecuencia de las anomalías (con qué frecuencia ocurren los mismos "errores") para ayudar a evaluar su impacto en el sistema en general.
Herramientas
La depuración varía en complejidad, desde corregir errores simples hasta realizar tareas largas y tediosas de recopilación, análisis y programación de actualizaciones de datos. La habilidad de depuración del programador puede ser un factor importante en la capacidad de depurar un problema, pero la dificultad de la depuración del software varía mucho con la complejidad del sistema y también depende, hasta cierto punto, del lenguaje de programación utilizado. y las herramientas disponibles, como los depuradores . Los depuradores son herramientas de software que permiten al programador monitorear la ejecución de un programa, detenerlo, reiniciarlo, establecer puntos de interrupción y cambiar valores en la memoria. El término depurador también puede referirse a la persona que realiza la depuración.
En determinadas situaciones, las herramientas de software de propósito general que son específicas del lenguaje por naturaleza pueden resultar muy útiles. Estos toman la forma de herramientas de análisis de código estático . Estas herramientas buscan un conjunto muy específico de problemas conocidos, algunos comunes y otros raros, dentro del código fuente, concentrándose más en la semántica (por ejemplo, flujo de datos) que en la sintaxis, como hacen los compiladores e intérpretes.
Existen herramientas tanto comerciales como gratuitas para varios idiomas; algunos afirman poder detectar cientos de problemas diferentes. Estas herramientas pueden resultar extremadamente útiles al comprobar árboles de fuentes muy grandes, donde no resulta práctico realizar recorridos de código. Un ejemplo típico de un problema detectado sería una desreferenciación de una variable que se produce antes de que se le asigne un valor a la variable. Como otro ejemplo, algunas de estas herramientas realizan una verificación estricta de tipos cuando el idioma no lo requiere. Por lo tanto, son mejores para localizar posibles errores en un código sintácticamente correcto. Pero estas herramientas tienen fama de dar falsos positivos, donde el código correcto se marca como dudoso. El antiguo programa lint de Unix es un ejemplo temprano.
El proceso de depuración normalmente comienza con la identificación de los pasos para reproducir el problema. Esto puede no ser una tarea trivial, especialmente con procesos paralelos y algunos Heisenbugs , por ejemplo. El entorno de usuario específico y el historial de uso también pueden dificultar la reproducción del problema.
Una vez reproducido el error, es posible que sea necesario simplificar la entrada del programa para facilitar la depuración. Por ejemplo, un error en un compilador puede provocar que falle al analizar un archivo fuente de gran tamaño. Sin embargo, después de la simplificación del caso de prueba, sólo unas pocas líneas del archivo fuente original pueden ser suficientes para reproducir el mismo fallo. La simplificación se puede realizar manualmente utilizando un enfoque de divide y vencerás , en el que el programador intenta eliminar algunas partes del caso de prueba original y luego comprueba si el problema persiste. Al depurar en una GUI , el programador puede intentar omitir algunas interacciones del usuario de la descripción original del problema para verificar si las acciones restantes son suficientes para provocar el error.
Una vez que el caso de prueba esté lo suficientemente simplificado, un programador puede usar una herramienta de depuración para examinar los estados del programa (valores de las variables, más la pila de llamadas ) y rastrear el origen de los problemas. Alternativamente, se puede utilizar el rastreo . En casos simples, el seguimiento consiste simplemente en unas pocas declaraciones impresas que generan los valores de las variables en puntos particulares durante la ejecución del programa. [ cita necesaria ]
Técnicas
La depuración interactiva utiliza herramientas de depuración que permiten procesar la ejecución de un programa paso a paso y pausarla para inspeccionar o alterar su estado. Las subrutinas o llamadas a funciones normalmente pueden ejecutarse a toda velocidad y pausarse nuevamente al regresar a su llamador, o en un solo paso, o cualquier combinación de estas opciones. Se pueden instalar puntos de ajuste que permitan la ejecución a máxima velocidad de código que no se sospecha que sea defectuoso y luego detenerse en un punto en el que sí lo sea. Establecer un punto de ajuste inmediatamente después del final de un ciclo de programa es una forma conveniente de evaluar el código repetido. Los puntos de vigilancia suelen estar disponibles, donde la ejecución puede continuar hasta que una variable particular cambie, y puntos de captura que hacen que el depurador se detenga ante ciertos tipos de eventos del programa, como excepciones o la carga de una biblioteca compartida.
La depuración o seguimiento de impresión es el acto de observar (en vivo o grabadas) declaraciones de seguimiento o declaraciones impresas que indican el flujo de ejecución de un proceso y la progresión de los datos. El rastreo se puede realizar con herramientas especializadas (como el rastreo de GDB) o mediante la inserción de declaraciones de rastreo en el código fuente. A este último a veces se le llamaDepuración printf , debido al uso de laprintfen C. Este tipo de depuración fue activado por el comando TRON en las versiones originales delBASIC. TRON significaba "Trace On". TRON hizo que los números de línea de cada línea de comando BASIC se imprimieran mientras se ejecutaba el programa.
El seguimiento de la actividad es similar al seguimiento (arriba), pero en lugar de seguir la ejecución del programa una instrucción o función a la vez, sigue la actividad del programa en función de la cantidad total de tiempo que dedica el procesador/CPU a ejecutar segmentos particulares de código. Esto generalmente se presenta como una fracción del tiempo de ejecución del programa dedicado a procesar instrucciones dentro de direcciones de memoria definidas (programas de código de máquina) o ciertos módulos de programa (lenguaje de alto nivel o programas compilados). Si se demuestra que el programa que se está depurando gasta una fracción excesiva de su tiempo de ejecución dentro de áreas rastreadas, esto podría indicar una mala asignación del tiempo del procesador causada por una lógica defectuosa del programa, o al menos una asignación ineficiente del tiempo del procesador que podría beneficiarse de los esfuerzos de optimización.
La depuración remota es el proceso de depurar un programa que se ejecuta en un sistema diferente al del depurador. Para iniciar la depuración remota, un depurador se conecta a un sistema remoto a través de un enlace de comunicaciones, como una red de área local. Luego, el depurador puede controlar la ejecución del programa en el sistema remoto y recuperar información sobre su estado.
La depuración post mortem es la depuración del programa después de que ya ha fallado . Las técnicas relacionadas a menudo incluyen varias técnicas de rastreo, como examinar archivos de registro, generar una pila de llamadas en caso de falla, [8] y análisis del volcado de memoria (o volcado de núcleo ) del proceso fallado. El volcado del proceso podría ser obtenido automáticamente por el sistema (por ejemplo, cuando el proceso ha terminado debido a una excepción no controlada), o mediante una instrucción insertada por el programador, o manualmente por el usuario interactivo.
Algoritmo de "cerca del lobo": Edward Gauss describió este algoritmo simple pero muy útil y ahora famoso en un artículo de 1982 para Communications of the ACM de la siguiente manera: "Hay un lobo en Alaska; ¿cómo lo encuentras? Primero construye una cerca en el medio". del estado, espera a que el lobo aúlle y determina de qué lado de la cerca está. Repite el proceso solo en ese lado, hasta llegar al punto donde puedas ver al lobo. [9] Esto se implementa, por ejemplo, en el sistema de control de versiones Git como el comando git bisect , que utiliza el algoritmo anterior para determinar qué confirmación introdujo un error en particular.
La depuración de grabación y reproducción es la técnica de crear una grabación de ejecución de programa (por ejemplo, utilizando la herramienta de depuración rr gratuita de Mozilla ; permitiendo la depuración/ejecución reversible), que se puede reproducir y depurar de forma interactiva. Útil para la depuración remota y la depuración de defectos intermitentes, no deterministas y otros defectos difíciles de reproducir.
La depuración del viaje en el tiempo es el proceso de retroceder en el tiempo a través del código fuente (por ejemplo, usando Undo LiveRecorder ) para comprender lo que sucede durante la ejecución de un programa de computadora; permitir a los usuarios interactuar con el programa; para cambiar el historial si lo desea y observar cómo responde el programa.
Depuración delta : una técnica para automatizar la simplificación de casos de prueba. [10] : pág.123
Saff Squeeze : una técnica para aislar fallas dentro de la prueba mediante la incorporación progresiva de partes de la prueba fallida. [11] [12]
Seguimiento de causalidad : existen técnicas para rastrear las cadenas de causa efecto en el cálculo. [13] Esas técnicas se pueden adaptar a errores específicos, como desreferencias de puntero nulo. [14]
En contraste con el entorno de diseño de software informático de propósito general, una característica principal de los entornos integrados es la gran cantidad de plataformas diferentes disponibles para los desarrolladores (arquitecturas de CPU, proveedores, sistemas operativos y sus variantes). Los sistemas integrados, por definición, no son diseños de propósito general: generalmente se desarrollan para una sola tarea (o una pequeña variedad de tareas) y la plataforma se elige específicamente para optimizar esa aplicación. Este hecho no sólo dificulta la vida de los desarrolladores de sistemas integrados, sino que también dificulta la depuración y prueba de estos sistemas, ya que se necesitan diferentes herramientas de depuración para diferentes plataformas.
A pesar del desafío de la heterogeneidad mencionado anteriormente, algunos depuradores se han desarrollado comercialmente, así como prototipos de investigación. Ejemplos de soluciones comerciales provienen de Green Hills Software , [19] Lauterbach GmbH [20] y MPLAB-ICD de Microchip (para depurador en circuito). Dos ejemplos de herramientas prototipo de investigación son Aveksha [21] y Flocklab. [22] Todos aprovechan una funcionalidad disponible en procesadores integrados de bajo costo, un módulo de depuración en chip (OCDM), cuyas señales se exponen a través de una interfaz JTAG estándar . Se los compara en función de cuántos cambios se necesitan en la aplicación y la tasa de eventos que pueden seguir.
Además de la tarea típica de identificar errores en el sistema, la depuración integrada del sistema también busca recopilar información sobre los estados operativos del sistema que luego puede usarse para analizar el sistema: para encontrar formas de aumentar su rendimiento u optimizar otros aspectos importantes. características (por ejemplo, consumo de energía, confiabilidad, respuesta en tiempo real, etc.).
Anti-depuración
La antidepuración es "la implementación de una o más técnicas dentro del código informático que dificulta los intentos de realizar ingeniería inversa o depurar un proceso objetivo". [23] Editores reconocidos lo utilizan activamente en esquemas de protección contra copia , pero también lo utiliza el malware para complicar su detección y eliminación. [24] Las técnicas utilizadas en la lucha contra la depuración incluyen:
Basado en API: comprueba la existencia de un depurador utilizando la información del sistema
Basado en excepciones: verifique si se interfiere con las excepciones
Bloques de procesos y subprocesos: compruebe si los bloques de procesos y subprocesos han sido manipulados
Código modificado: verifique las modificaciones de código realizadas por un depurador que maneja puntos de interrupción del software
Basado en hardware y registros: busque puntos de interrupción de hardware y registros de CPU
Timing y latencia: comprueba el tiempo necesario para la ejecución de instrucciones
Detección y penalización del depurador [24]
Un ejemplo temprano de antidepuración existía en las primeras versiones de Microsoft Word que, si se detectaba un depurador, generaba un mensaje que decía: "El árbol del mal da frutos amargos. Ahora destrozamos el disco del programa", después de lo cual provocaba el disquete. unidad de disco para emitir ruidos alarmantes con la intención de asustar al usuario para que no vuelva a intentarlo. [25] [26]
^ "InfoWorld 5 de octubre de 1981". 5 de octubre de 1981. Archivado desde el original el 18 de septiembre de 2019 . Consultado el 17 de julio de 2019 .
^ "Copia archivada". Archivado desde el original el 21 de noviembre de 2019 . Consultado el 17 de diciembre de 2019 .{{cite web}}: CS1 maint: archived copy as title (link)
^ S. Gill, El diagnóstico de errores en programas en el EDSAC Archivado el 6 de marzo de 2020 en Wayback Machine , Actas de la Royal Society de Londres. Serie A, Ciencias Físicas y Matemáticas, vol. 206, núm. 1087 (22 de mayo de 1951), págs. 538-554
^ Robert VD Campbell, Evolución de la computación automática Archivado el 18 de septiembre de 2019 en Wayback Machine , Actas de la reunión nacional ACM de 1952 (Pittsburgh), páginas 29-32, 1952.
^ Alex Orden, Solución de sistemas de desigualdades lineales en una computadora digital, Actas de la reunión nacional ACM de 1952 (Pittsburgh), p. 91-95, 1952.
^ Howard B. Demuth, John B. Jackson, Edmund Klein, N. Metropolis, Walter Orvedahl, James H. Richardson, MANIAC doi=10.1145/800259.808982, Actas de la reunión nacional de la ACM de 1952 (Toronto), p. 13-16
^ El sistema de tiempo compartido compatible Archivado el 27 de mayo de 2012 en Wayback Machine , MIT Press, 1963
^ "Depuración postmortem". Archivado desde el original el 17 de diciembre de 2019 . Consultado el 17 de diciembre de 2019 .
^ EJ Gauss (1982). "Prácnicas: el algoritmo de depuración 'cerca del lobo'". Comunicaciones de la ACM . 25 (11): 780.doi : 10.1145 /358690.358695 . S2CID 672811.
^ Zeller, Andrés (2005). Por qué fallan los programas: una guía para la depuración sistemática . Morgan Kaufman. ISBN1-55860-866-4.
^ "Kent Beck, Golpéalos alto, golpéalos bajo: pruebas de regresión y Saff Squeeze". Archivado desde el original el 11 de marzo de 2012.
^ Rainsberger, JB (28 de marzo de 2022). "El apretón de Saff". El que susurra códigos . Consultado el 28 de marzo de 2022 .
^ Zeller, Andreas (1 de noviembre de 2002). "Aislar cadenas de causa-efecto de programas informáticos". Notas de ingeniería de software de ACM SIGSOFT . 27 (6): 1–10. doi :10.1145/605466.605468. ISSN 0163-5948. S2CID 12098165.
^ Vínculo, Michael D.; Nethercote, Nicolás; Kent, Stephen W.; Guyer, Samuel Z.; McKinley, Kathryn S. (2007). "Seguimiento de las manzanas podridas". Actas de la 22ª conferencia anual ACM SIGPLAN sobre sistemas y aplicaciones de programación orientada a objetos - OOPSLA '07 . pag. 405. doi :10.1145/1297027.1297057. ISBN9781595937865. S2CID 2832749.
^ Rinard, Martín C. (2008). "Perspectiva técnica Parchear errores del programa". Comunicaciones de la ACM . 51 (12): 86. doi :10.1145/1409360.1409381. S2CID 28629846.
^ Harman, Mark (2010). "Técnicas de parcheo automatizadas". Comunicaciones de la ACM . 53 (5): 108. doi :10.1145/1735223.1735248. S2CID 9729944.
^ ab Gazzola, Luca; Micucci, Daniela; Mariani, Leonardo (2019). "Reparación automática de software: una encuesta" (PDF) . Transacciones IEEE sobre ingeniería de software . 45 (1): 34–67. doi : 10.1109/TSE.2017.2755013 . hdl :10281/184798. S2CID 57764123.
^ Bronceado, Shin Hwei; Roychoudhury, Abhik (2015). "relifix: reparación automatizada de regresiones de software". 2015 IEEE/ACM 37ª Conferencia Internacional IEEE sobre Ingeniería de Software . IEEE. págs. 471–482. doi :10.1109/ICSE.2015.65. ISBN978-1-4799-1934-5. S2CID 17125466.
^ "Depurador de hardware SuperTrace Probe". www.ghs.com . Archivado desde el original el 1 de diciembre de 2017 . Consultado el 25 de noviembre de 2017 .
^ "Herramientas de depuración y seguimiento en tiempo real". www.lauterbach.com . Archivado desde el original el 25 de enero de 2022 . Consultado el 5 de junio de 2020 .
^ Tancreti, Mateo; Hossain, Mohammad Sajjad; Bagchi, Saurabh; Raghunathan, Vijay (2011). "Aveksha". Actas de la novena conferencia ACM sobre sistemas de sensores integrados en red . SenSys '11. Nueva York, NY, Estados Unidos: ACM. págs. 288–301. doi :10.1145/2070942.2070972. ISBN9781450307185. S2CID 14769602.
^ Lim, romano; Ferrari, Federico; Zimmerling, Marco; Walser, Christoph; Sommer, Philipp; Beutel, enero (2013). "FlockLab". Actas de la 12ª conferencia internacional sobre procesamiento de información en redes de sensores . IPSN '13. Nueva York, NY, Estados Unidos: ACM. págs. 153-166. doi :10.1145/2461381.2461402. ISBN9781450319591. S2CID 447045.
^ Escudos, Tyler (2 de diciembre de 2008). "Serie Anti-Depuración - Parte I". Veracode . Archivado desde el original el 19 de octubre de 2016 . Consultado el 17 de marzo de 2009 .
^ ab "Protección de software mediante antidepuración Michael N Gagnon, Stephen Taylor, Anup Ghosh" (PDF) . Archivado desde el original (PDF) el 1 de octubre de 2011 . Consultado el 25 de octubre de 2010 .
^ "Microsoft Word para DOS 1.15". Archivado desde el original el 14 de mayo de 2013 . Consultado el 22 de junio de 2013 .
Lectura adicional
Agans, David J. (2002). Depuración: las nueve reglas indispensables para encontrar incluso los problemas de software y hardware más esquivos. AMACOM. ISBN 0-8144-7168-4.
Blunden, Bill (2003). Exorcismo de software: un manual para depurar y optimizar el código heredado . APulse. ISBN 1-59059-234-4.
Ford, Ann R.; Teorey, Toby J. (2002). Depuración práctica en C++. Prentice Hall. ISBN 0-13-065394-2.
Grötker, Thorsten; Holtmann, Ulrich; Keding, Holger; Wloka, Markus (2012). La guía del desarrollador para la depuración, segunda edición . Crear espacio. ISBN 978-1-4701-8552-7.
Metzger, Robert C. (2003). Depurar pensando: un enfoque multidisciplinario . Prensa digital. ISBN 1-55558-307-5.
Myers, Glenford J (2004). El arte de las pruebas de software. ISBN de John Wiley & Sons Inc. 0-471-04328-1.
Robbins, Juan (2000). Aplicaciones de depuración . Prensa de Microsoft. ISBN 0-7356-0886-5.
Telles, Mateo A.; Hsieh, Yuan (2001). La ciencia de la depuración . El Grupo Coriolis. ISBN 1-57610-917-8.
Vostokov, Dmitry (2008). Antología de análisis de volcado de memoria Volumen 1 . Tarea abierta. ISBN 978-0-9558328-0-2.
Zeller, Andreas (2009). Por qué fallan los programas, segunda edición: una guía para la depuración sistemática . Morgan Kaufman. ISBN 978-0-1237-4515-6.
Peggy Aldrich Kidwell, Acechando al esquivo error informático, IEEE Annals of the History of Computing, 1998.
Enlaces externos
Wikiquote tiene citas relacionadas con la depuración .
El Wikibook Principios de programación informática tiene una página sobre el tema: Depuración
Patrones de análisis de volcados por caída: artículos detallados sobre cómo analizar y encontrar errores en volcados por caída
Aprenda los conceptos básicos de la depuración: cómo mejorar sus habilidades de depuración, un buen artículo en IBM DeveloperWorks (archivado desde el original el 18 de febrero de 2007)
Depuración basada en complementos para sistemas integrados
Prueba y depuración de sistemas integrados: acerca de la generación de entradas digitales: resultados de una encuesta sobre prueba y depuración de sistemas integrados, Byte Paradigm (archivado desde el original el 12 de enero de 2012)