Un depurador o herramienta de depuración es un programa informático que se utiliza para probar y depurar otros programas (el programa "destino"). El uso principal de un depurador es ejecutar el programa de destino en condiciones controladas que permitan al programador rastrear su ejecución y monitorear cambios en los recursos de la computadora que pueden indicar un código defectuoso. Las funciones de depuración típicas incluyen la capacidad de ejecutar o detener el programa de destino en puntos específicos, mostrar el contenido de la memoria, los registros de la CPU o los dispositivos de almacenamiento (como unidades de disco) y modificar la memoria o registrar el contenido para ingresar datos de prueba seleccionados que puedan ser una causa de ejecución defectuosa del programa.
Como alternativa, el código a examinar podría ejecutarse en un simulador de conjunto de instrucciones (ISS), una técnica que permite una gran potencia en su capacidad para detenerse cuando se encuentran condiciones específicas, pero que normalmente será algo más lento que ejecutar el código directamente en el simulador apropiado. (o el mismo) procesador. Algunos depuradores ofrecen dos modos de operación, simulación total o parcial, para limitar este impacto.
Una " trampa " ocurre cuando el programa no puede continuar normalmente debido a un error de programación o datos no válidos. Por ejemplo, es posible que el programa haya intentado utilizar una instrucción que no está disponible en la versión actual de la CPU o haya intentado acceder a una memoria no disponible o protegida . Cuando el programa "atrapa" o alcanza una condición preestablecida, el depurador generalmente muestra la ubicación en el código original si es un depurador de nivel fuente o un depurador simbólico , comúnmente visto ahora en entornos de desarrollo integrados . Si es un depurador de bajo nivel o un depurador de lenguaje de máquina, muestra la línea en el desensamblado (a menos que también tenga acceso en línea al código fuente original y pueda mostrar la sección apropiada de código del ensamblado o compilación).
Normalmente, los depuradores ofrecen un procesador de consultas, un solucionador de símbolos, un intérprete de expresiones y una interfaz de soporte de depuración en su nivel superior. [1] Los depuradores también ofrecen funciones más sofisticadas, como ejecutar un programa paso a paso ( un solo paso o animación del programa ), detener ( romper ) (pausar el programa para examinar el estado actual) en algún evento o instrucción específica mediante un punto de interrupción y seguimiento de los valores de las variables. [2] Algunos depuradores tienen la capacidad de modificar el estado del programa mientras se está ejecutando. También es posible continuar la ejecución en una ubicación diferente del programa para evitar un bloqueo o un error lógico.
La misma funcionalidad que hace que un depurador sea útil para corregir errores permite que se utilice como herramienta de descifrado de software para evadir la protección contra copias , la gestión de derechos digitales y otras funciones de protección del software. A menudo también lo hace útil como herramienta de verificación general, cobertura de fallas y analizador de rendimiento , especialmente si se muestran las longitudes de las rutas de instrucción . [3] Las primeras microcomputadoras con almacenamiento basado en disco a menudo se beneficiaban de la capacidad de diagnosticar y recuperar registros de datos de directorio o registro corruptos, de "recuperar" archivos marcados como eliminados o de descifrar la protección con contraseña de archivos.
La mayoría de los principales motores de depuración, como gdb y dbx , proporcionan interfaces de línea de comandos basadas en consola . Las interfaces de depurador son extensiones populares para los motores de depuración que brindan integración IDE , animación de programas y funciones de visualización.
La depuración de grabación y reproducción , [4] también conocida como "grabación de vuelo de software" o "grabación de ejecución de programa", captura los cambios de estado de la aplicación y los almacena en el disco a medida que se ejecuta cada instrucción de un programa. Luego, la grabación se puede reproducir una y otra vez y depurar interactivamente para diagnosticar y resolver defectos. La depuración de grabación y reproducción es muy útil para la depuración remota y para resolver defectos intermitentes, no deterministas y otros defectos difíciles de reproducir.
Algunos depuradores incluyen una función llamada " depuración inversa ", también conocida como "depuración histórica" o "depuración inversa". Estos depuradores permiten retroceder en el tiempo la ejecución de un programa. Varios depuradores incluyen esta característica. Microsoft Visual Studio (edición 2010 Ultimate, 2012 Ultimate, 2013 Ultimate y 2015 Enterprise) ofrece depuración inversa IntelliTrace para C#, Visual Basic .NET y algunos otros lenguajes, pero no para C++. También existen depuradores inversos para C, C++, Java, Python, Perl y otros lenguajes. Algunos son de código abierto; algunos son software comercial propietario. Algunos depuradores inversos ralentizan el objetivo en órdenes de magnitud, pero los mejores depuradores inversos provocan una desaceleración de 2 veces o menos. La depuración inversa es muy útil para ciertos tipos de problemas, pero todavía no se usa comúnmente. [5]
Además de las funciones de los depuradores inversos, la depuración de viajes en el tiempo también permite a los usuarios interactuar con el programa, cambiar el historial si lo desean y observar cómo responde el programa.
Algunos depuradores operan en un único idioma específico, mientras que otros pueden manejar varios idiomas de forma transparente. Por ejemplo, si el programa de destino principal está escrito en COBOL pero llama a subrutinas en lenguaje ensamblador y a subrutinas PL/1 , es posible que el depurador tenga que cambiar dinámicamente los modos para adaptarse a los cambios en el lenguaje a medida que ocurren.
Algunos depuradores también incorporan protección de memoria para evitar violaciones del almacenamiento , como el desbordamiento del búfer . Esto puede ser extremadamente importante en entornos de procesamiento de transacciones donde la memoria se asigna dinámicamente desde 'grupos' de memoria tarea por tarea.
La mayoría de los microprocesadores modernos tienen al menos una de estas características en el diseño de su CPU para facilitar la depuración:
Algunos de los depuradores más capaces y populares implementan sólo una simple interfaz de línea de comandos (CLI), a menudo para maximizar la portabilidad y minimizar el consumo de recursos. Los desarrolladores suelen considerar que la depuración a través de una interfaz gráfica de usuario (GUI) es más fácil y productiva. [ cita necesaria ] Esta es la razón de las interfaces visuales, que permiten a los usuarios monitorear y controlar los depuradores subordinados solo CLI a través de una interfaz gráfica de usuario . Algunas interfaces de depurador de GUI están diseñadas para ser compatibles con una variedad de depuradores de CLI únicamente, mientras que otras están dirigidas a un depurador específico.
La depuración se utiliza a menudo para descifrar o piratear software ilegalmente, lo que suele ser ilegal incluso cuando no se realiza con fines maliciosos. Los Crackme son programas diseñados específicamente para ser descifrados o depurados. Estos programas permiten a quienes tienen depuradores practicar su capacidad de depuración sin meterse en problemas legales.
Algunos depuradores ampliamente utilizados son:
Los depuradores de minicomputadoras anteriores incluyen:
Los depuradores de mainframe incluyen: