2008-10-20 15 views
15

Me interesan los consejos y trucos relacionados con la depuración de un proyecto C/C++ en el depurador de Visual Studio. Hace poco me di cuenta de que si usted tiene un puntero a un determinado tipo de datos, digamos char * ptr, a continuación, se puede ver como una matriz en la ventana de inspección utilizando una sintaxis como:Sugerencias y trucos para depurar Visual Studio (para proyectos C/C++)

 
ptr,10 

Esto mostrará los primeros 10 elementos de la dirección de la PTR, de la misma manera, ya que sería necesario que las definición sería:

 
char ptr[10]; 

Qué otros consejos y trucos Qué sabes de depurador de Visual Studio?

PD: Espero que este tema no haya sido ya discutido. Si encuentra una publicación similar, hágamelo saber.

Respuesta

9

Me gusta mucho la posibilidad de modificar la visualización del Depurador de tipos y estructuras a través de AutoExp.dat. El archivo se encuentra en

.. \ Microsoft Visual Studio 9,0 \ Common7 \ Packages \ depurador \ autoexp.dat

y permite definir las plantillas propias para la visualización de datos durante la depuración:

Durante la depuración, consejos y artículos en la visualización de datos y ventanas de variables son expande automáticamente para mostrar sus elementos más importantes. La expansión sigue el formato dado por las reglas en este archivo. Puede agregar reglas para sus tipos o cambiar las reglas predefinidas .

El archivo está lleno de buenos ejemplos y puede adaptar fácilmente ciertas plantillas a sus necesidades o agregar nuevas para sus propias clases.

6

Puede establecer los nombres de sus hilos utilizando un código algo incómodo. Vea esto article at MSDN.

4

Algunas personas realmente no se dan cuenta de que puede cambiar los valores de las variables y mover el punto de ejecución. Esto es muy útil si llega a un punto de interrupción después de una línea de código que le interesa, y desea volver a intentarlo con diferentes valores.

6

Probablemente el consejo más importante que puede utilizar es DebugBreak. Ponga DebugBreak() en su código, y cuando se ejecuta es como golpear un punto de quiebre.

Lo bueno es que puedes ponerle condiciones que pueden ser difíciles de establecer en un punto de interrupción regular. Aprende a usar esto!

Por ejemplo, su programa se bloquea cuando digiere un determinado archivo de datos. Descubres que se bloquea en una determinada función, pero solo después de llamarla un millón de veces +. También ha descubierto que se está bloqueando porque una cierta variable llamada x tiene el valor 1001, pero x se supone que está entre 0 y 1000.Entonces, en lugar de esperar tomar afortunadamente el lugar donde x se vuelve grande, encuentras cada lugar que x cambia. Inmediatamente después de poner la instrucción: if (x> 1000) DebugBreak();

Sí, puede hacer esto con puntos de interrupción condicionales, pero he visto un programa que demora 1 segundo en ejecutarse a 15 minutos con tres puntos de interrupción coniditional, pero se ejecuta en 1,5 segundos con DebugBreak.

Habiendo dicho esto, aquí hay un par de sugerencias útiles. Matemáticamente demuéstrate a ti mismo que la razón por la que crees que está ocurriendo un error es que el error real suceda al menos una parte del tiempo (no es probable que haya dos errores que creen el mismo problema, pero sucede). He visto algunas de las correcciones más estúpidas puestas en práctica porque la gente "siente" que es la respuesta para el error. Asegúrese de que su lógica sea tan sólida como cualquier prueba en una clase de geometría.

La segunda sugerencia si pones una solución experimental y no hace nada. Llevarlo a cabo.

+0

Este es un buen consejo sobre la programación defensiva, pero no es un consejo específico para el depurador de Visual Studio. Puede programar DebugAsserts en cualquier entorno. –

3
  • Algunos/relacionados Vea sugerencias de depuración:

    Use la siguiente en la ventana Inspección para averiguar lo que volvería GetLastError():

    @ ERR, hr

  • Si use Visual Studio 2003 o una versión anterior, use esta expresión de reloj para conocer la longitud de su std :: vector v:

    v._Mylast-v._Myfirst

    También puede listar, p. Ej. primeras 5 entradas con esta expresión:

    v._Myfirst, 5

    Esto no funciona cuando se utiliza STLport, y el método obsoletos en VS> = 2005 con los nuevos visualizadores de expresión.

  • Si desea ver el valor de retorno de una función, mire el registro eax (solo ingrese eax en la ventana del reloj). Incluso puede cambiar el valor devuelto. Si se trata de un puntero a una cadena o matriz, también puede ingresar eax en la ventana Memoria para ver la cadena subyacente.

5

Algunos otros consejos & trucos que he encontrado en este artículo:

 
ptr,su -> display ptr as if it was a string of unicode chars. 
val,hr -> view val as a hresult data 
val,wc -> view val as a window class 
val,wm -> view val as a window message 
Cuestiones relacionadas