¿Cuáles son algunos consejos generales excepcionalmente útiles para la depuración?

Aquí hay algunos consejos muy generales para la depuración.

  1. Conozca a su depurador . Si no es un IDE, aprenda cómo señalarlo a los archivos de origen y la información de compilación necesaria para realizar la depuración a nivel de origen. Cree un programa muy simple que llame a una rutina ubicada en un segundo archivo fuente. Asegúrese de que puede establecer puntos de interrupción y aprenda a usar los comandos principales. Asegúrese de conocer la diferencia entre ‘entrar’ y ‘pasar’.
  2. Programa con depuración en mente . En otras palabras,
    1. Considere tener valores intermedios para expresiones complejas.
    2. Si es apropiado para su idioma, separe la creación de objetos y la inicialización de objetos.
    3. Tenga cuidado al usar plantillas, macros y otras construcciones que generan automáticamente código relativamente opaco.
    4. Conozca la diferencia entre las versiones optimizadas y de depuración de la ejecución del código, si existen en su idioma. Considere incluir declaraciones de código de solo depuración para el código que solo aparece en la compilación de depuración. Por ejemplo, en C ++ usarías #ifdef _DEBUG.
    5. Agregue el registro a su programa. Use ‘niveles de registro’ que puede configurar con una variable estática para aumentar y disminuir la cantidad de información registrada para la solución de problemas.
    6. Para cualquier generador pseudoaleatorio utilizado, guarde las semillas para poder codificarlas en forma rígida si necesita reproducir un resultado particular.
  3. Aprenda a establecer puntos de interrupción condicionales . Como su nombre lo indica, los puntos de interrupción condicionales solo se activan cuando se establece una condición. Por ejemplo, en un bucle de 1 a 10,000, si sé que hay un problema en la iteración 7143, puedo establecer un punto de interrupción condicional para la primera declaración del bucle cuando el iterador es igual a 7143. Es más lento que la ejecución normal, pero aún así un ENORME ahorro de tiempo, comparado con golpear ‘go’ 7143 veces.
  4. Aprende la depuración remota . Muchos depuradores le permiten conectarse de manera remota a un proceso, incluso en otra máquina, y depurarlo. Esto es invaluable para depurar aplicaciones de pantalla completa y sensibles al enfoque.
  5. Si su IDE soporta la depuración, ¡apréndalo ! Si puede compilar y depurar dentro de su IDE, ya tiene todas las herramientas de búsqueda de fuentes a las que está acostumbrado. Es una gran manera de ir Si puede descubrir cómo hacer esto con menos de una semana de esfuerzo, debería hacerlo.

Hay toneladas más, pero esto es suficiente para empezar. Algunos trucos que me han funcionado bien en el pasado:

  1. Búsqueda binaria . Si tiene un código y simplemente no puede encontrar el origen de un bloqueo o corrupción, comente la mitad del código sospechoso y vea si se repite. Cuando encuentre la mitad en la que sucede, comente la mitad de esa mitad, y así sucesivamente, hasta que la aísle en una pequeña parte del código. Esto funciona para problemas de compilación extraños también.
  2. Imprimiendo Nunca subestime el poder de imprimir en un código difícil de depurar. Si no puede imprimir en una consola, escriba en un archivo. lo ideal sería hacer esto con una API DebugLog.
  3. Seguimiento del estado . Agregue instrumentación para las variables importantes relacionadas con su problema que vuelca sus valores. Ver la progresión de estos valores variables puede ayudarlo a localizar dónde hay un error lógico o aritmético.

Usa el control de versiones. Haga que una versión anterior de un programa funcione, o que haga una comparación de código fuente entre la versión con el error y la que no.

No introduzca 5 nuevas características en una revisión. Preséntelos uno por uno, al menos en el entorno de desarrollo, de modo que ya haya una versión intermedia para probar y no tenga que comenzar a desactivar las funciones en el nuevo código para aislar un problema.

Arregla lo primero primero. Cuando está ejecutando algo, y algo se rompe antes de llegar a lo que cree que está depurando, comprenda y solucione eso. Con mucha frecuencia, la primera indicación de cualquier falla es la relacionada con la raíz de las fallas subsiguientes, aparentemente no relacionadas.

En primer lugar, no hay atajos.

Por lo general, lo que hago es leer primero el código y su arquitectura. Al leer el código, conocerás su flujo. Cuando sepa que está fluyendo, generalmente sabrá dónde atacar la ubicación del problema en el código. Por lo tanto, acortar el tiempo de depuración y esto es útil si desea invertir su tiempo en un programa.

Si, por otro lado, tiene prisa, simplemente pase el código para encontrar lo que cree que es donde ocurre el problema. Sin embargo, esto no es muy efectivo (y no es una solución de calidad). Como tendrá dificultades para saber si su corrección es correcta de acuerdo con la lógica de negocios o las reglas del programa.

Compruebe primero los elementos o arreglos más simples. No asumas el peor escenario posible. Trabaja metódicamente con las soluciones más simples primero. Intente reiniciar primero, luego pase a otras comprobaciones, como buscar virus y malware, etc. Hay algunas referencias excelentes en la web, utilícelas.

Hay 2 aspectos principales de la depuración. Una es poder reducir el área de interés a una parte más pequeña de toda la ejecución del programa, y ​​la segunda es poder hacer un acercamiento y ver los detalles de los valores de las variables una vez que lo haya reducido.

Para poder hacer lo primero, que es encontrar el área de interés de todo un flujo de programa, lo primero que necesita es dibujar un esquema o un árbol de módulos de llamadas a funciones. (Omita las funciones más pequeñas llamadas más de una vez). La mayoría de los programas hacen algo repetitivamente en un bucle, así que sepa dónde están esos bucles. Hacen algún tipo de registro para poder seguir groseramente el flujo, hasta que se estropea o se detiene. Puede iniciar sesión en un archivo, imprimir en la pantalla, etc., con un mínimo de salida. O si es posible, solo tiene la salida o el punto de interrupción cuando un valor particular cambia.

Entonces tienes que ser capaz de aumentar la salida o la visibilidad del valor. Una vez que conozca el área específica de interés, debe poder avanzar y ver más valores. Esto se puede lograr con un depurador IDE o con una definición global que aumenta el alcance del registro de depuración después de algún punto de ejecución.

Hay una estrategia llamada media división. Trate de dividir el código en partes, las que funcionan y las que no. Mira las entradas y las salidas. Basura en significa basura afuera, así que encuentra donde tienes basura. Luego, “jugar a la computadora”, es decir, fingir que eres una computadora con la entrada y recorrer todo el código, una línea a la vez hasta que puedas ver dónde se rompe.

Depende del tipo de error.

  • ¿El problema se introdujo recientemente o siempre estuvo presente?
  • ¿Se puede reproducir de forma fiable?
  • ¿Se puede simplificar el caso de prueba al mínimo?
  • ¿Puede inspeccionar todas las variables cerca de la ubicación de la falla?
  • ¿El problema desaparece con o sin optimización?

Depure los datos primero, el código segundo.