2008-11-19 15 views
7

¿Cuáles son las sugerencias de depuración de expertos para su idioma favorito que cree que todos deberían usar?¿Cuáles son tus mejores consejos para eliminar errores?

Como ejemplo, proporcionaré mis sugerencias de depuración de C++, que entre ellos me ayudan a eliminar la mayoría de los errores que encuentro, en este lenguaje a menudo difícil de depurar.

C++

  • Aumentar el nivel de advertencia de su compilador al máximo, y luego se detiene esas advertencias que se producen una gran cantidad y que ha decidido que no se preocupan por (para mí es parámetros no utilizados) . g ++ no advierte acerca de declaraciones de devolución faltantes en las funciones (un problema que encuentro con frecuencia) hasta que el nivel de advertencia es muy alto.

  • ¡Aprenda a activar la biblioteca estándar de depuración de su compilador, y úsela! (-D_GLIBCXX_DEBUG para g ++). Esto encuentra muchos errores y también ayuda a mostrar exactamente dónde ocurrieron los errores.

  • Siempre, siempre, siempre ejecute su código a través de un corrector de memoria realmente bueno, como valgrind, y resuelva todos los problemas que produce.

Respuesta

2

Un par de la mía, de pasar muchas noches de depuración cosas que el entorno de tiempo de ejecución compilador o podría haberme advertido sobre si había utilizado correctamente:

  • Si estás haciendo algo con los punteros en C++, assert() cuando sea adecuado. De hecho, assert() invariantes es generalmente una buena idea y puede reducir el tiempo de depuración en ese error oscuro de semanas a minutos. Solo recuerda apagarlos en la versión de lanzamiento. Ah, y no pongas nada allí que tenga efectos secundarios, de lo contrario estarás depurando tu versión de lanzamiento por un tiempo.No me pregunte cómo me enteré de que uno
  • En una línea similar, BOOST_STATIC_ASSERT puede ser extremadamente útil para la comprobación de las discrepancias se puede comprobar en tiempo de compilación
  • depuradores memoria como PurifyPlus o valgrind son excelentes dispositivos de ahorro de tiempo y debe estar en la máquina de todos los desarrolladores
  • aprender a utilizar el depurador adecuadamente para que pueda aprovechar toda su potencia en lugar de usar como un dispositivo que permite a un solo paso a través de su código
  • Si estás realmente atascado , explique el problema y el código a un colega
  • Para C++, una herramienta como FlexeLint/PC-Lint puede ayudar a identificar una gran cantidad de cosas difíciles de encontrar una vez que lo haya configurado correctamente. Tendrá que invertir el tiempo para configurarlo; de lo contrario, se ahogará en advertencias
  • Si está escribiendo C++ y está utilizando los contenedores estándar, escriba el código que usa iteradores y deje la versión de depuración del tiempo de ejecución (o un STL de depuración) atrapa tus errores de uno por uno. Si usa índices para referenciar elementos en, por ejemplo, un archivo std :: vector <> tendrá que encontrarlos usted mismo
  • Ejecute el código a través de compiladores diferentes si puede y preste atención a las advertencias que produce cada uno de ellos. Sin embargo, asegúrese de que se encuentren en niveles similares de compatibilidad de idiomas (no tiene sentido ejecutar código C++ moderno a través de MS VC++ 6) de lo contrario terminará persiguiendo problemas que realmente no existen.

Idealmente, usted debe tratar de detectar los problemas antes de tener que arrancar el depurador - nada se puede ajustar de tal manera que se crea un error de compilación es mucho más fácil de arreglar en comparación con el seguimiento hacia abajo en el depurador y volviendo a poner eso.

1

Siempre tenga "err, hr" en la ventana de su reloj. Mostraré el resultado que obtendrá al llamar a GetLastError. Y se actualiza dinámicamente cuando revisas el código.

5

Conozca qué significan los diferentes números mágicos que VS handler de memoria escribe cuando maneja la memoria.

0xCDCDCDCD Asignado en el montón, pero no inicializado. Por malloc
0xCCCCCCCC Asignado en la pila, pero no inicializado.
0xDDDDDDDD Liberación de la memoria del montón. Por libre
0xFDFDFDFD Las vallas "NoMansLand" se colocan automáticamente en el límite de la memoria del montón. Nunca debe ser sobrescrito. Si sobrescribe uno, probablemente esté caminando al final de una matriz.
0xFEEEFEEE Memoria eliminada por HeapFree
0xBAADF00D Asignado en el montón, pero no inicializado. Por HeapAlloc
0xABABABAB No lo sé. Si alguien sabe lo que esto significa, por favor agregue eso.

+0

¿No es esto específico para algunos entornos? Google parece estar diciendo Visual Studio. – philant

+0

Supongo que eso es a lo que Magnus se refería con la referencia 'VS' anterior ... –

+0

¡Uy! Ni siquiera lo vi, gracias. – philant

0

No estoy seguro si esto cuenta como depuración, pero para C y el código Objective-C encuentro que el LLVM/Clang Static Analyzer es invaluable. Ayuda a detectar errores, pérdidas de memoria y errores lógicos incluso antes de ver sus efectos.

1

Mi depuración (PHP) se compone principalmente de una adición a la última línea de la (passworded, encerrado en IP) página:

echo '<pre>'; print_r($GLOBALS); echo '</pre>'; 

Si el problema no está en allí se puede depurar 'adecuadamente' , pero 9 veces en 10 saltará de eso.

0

En depurador de Visual C++ a menudo se encuentra en una función de línea única en línea, que no puede entrar y ver su (s) local (es). Por ejemplo:

class foo 
    { 
    int bar() { int i = func1(); int j = func2(i); return j; } 
    }; 

Para mostrar el valor de i, necesita un marco de pila. Pero el depurador no entraría en la barra() y le mostraría el contenido de i.

El truco aquí es habilitar el ensamblaje en línea en el depurador. Esto amplía las instrucciones del procesador de las funciones, que ahora son más que una sola línea. Entonces ahora puede entrar en la función y consultar las variables.

O tal vez hay otra manera de hacerlo. :)

-1

No tengo referencias para esto, pero me dijeron que la dirección 0xABABABAB significa 'memoria más allá de los límites de la memoria asignada'. Espero eso ayude.

0

Ocasionalmente ejecute su compilación Release, en lugar de su compilación Debug. Algunos errores solo ocurren cuando las optimizaciones están activadas.

Cuestiones relacionadas