2010-10-06 19 views
6

Estoy depurando una aplicación (C++), y he encontrado un punto en el código donde quiero cambiar un valor (a través del depurador). Así que ahora, tengo un conjunto de punto de interrupción, con lo que hago:Visual Studio Breakpoint Macro para modificar un valor?

  • depurador alcanza punto de interrupción
  • modifico la variable quiero cambiar
  • que presione F5 para continuar ejecutando
  • espuma, aclarar, repetir

Está llegando a este punto crítico mucho, por lo que me gustaría automatizarlo. Me gustaría configurar el punto de interrupción para ejecutar una macro y continuar la ejecución.

Sin embargo, no tengo experiencia en la escritura de macros de VisualStudio, por lo que no conozco los comandos para modificar una variable del programa en ejecución. Miré alrededor, pero hasta ahora no he encontrado nada útil en línea.

+0

¿Cómo desea modificar la variable? p.ej. incrementar un contador – Dennis

+0

Tengo un puntero y quiero establecerlo en NULL – Tim

Respuesta

12

He encontrado cómo hacerlo con una macro. Inicialmente, traté de usar Ctrl-Shift-R para grabar una macro de pulsaciones de teclas, pero dejó de grabar cuando hice Ctrl-Alt-Q. Pero pude editar la macro para que funcione. Así que esto es lo que hice, en caso de que alguien más quiera hacer algo similar.

  • Herramientas -> Macros -> Explorador de macros
  • clic derecho -> Nueva macro

    Public Module RecordingModule 
        Sub setvalue() 
         DTE.Debugger.ExecuteStatement("variable_name=0") 
        End Sub 
    End Module 
    

Esta macro se ejecutará la instrucción de asignación, configuración de mi variable (en este caso, convirtiéndolo en un puntero NULL).

  • Haga clic derecho en un punto de interrupción -> Cuando Hit ...
  • Comprobar "ejecutar una macro"
  • Seleccionar Macros.MyMacros.RecordingModule.setvalue
  • Comprobar "Continuar la ejecución"
  • Haga clic en OK

Luego, pude ejecutar mi programa, ajustando automáticamente un puntero a NULL a medida que avanzaba. Esto fue muy útil para las pruebas y no requirió volver a compilar.

+0

Ya no es cierto en Visual Studio 2015 :( –

-1

Si piensa en una macro de la misma manera que Microsoft Excel, entonces no tiene suerte. No funciona del todo de esa manera.

En C++, una macro se refiere a una pequeña función en línea creada con #define. Es un preprocesador, por lo que una macro es como usar un reemplazo en todas sus referencias con su cuerpo.

Por ejemplo:

#define add(a,b) ((a)+(b)) 

int main() { 
    int a=3, b=4, c=5, d=6, e, f; 
    d = add(a,b); 
    e = add(c,d); 
} 

Desea que el compilador de C++ como:

int main() { 
    int a=3, b=4, c=5, ...; 
    d = ((a)+(b)); 
    e = ((c)+(d)); 
} 

Ahora, de vuelta a su pregunta. Si la variable está dentro de alcance en este punto de interrupción, acaba de establecer que desde dentro de su código:

myVar = myValue; 

Si no lo es, pero se garantiza que existe, es posible que necesite un pequeño programa. Diga que esta variable es un int, haga un puntero int global. Si esta variable es estática, asegúrese de establecerla en su dirección y regresar a NULL dentro de su alcance. Si es dinámico, es posible que necesite un trabajo adicional. Aquí está un ejemplo:

int* globalIntPointer; 

void func() { 
    *globalIntPointer = 3; 
    //... 
} 

int main() { 
    int a = 5; 
    globalIntPointer = &a; 
    func(); 
    //... 
    globalIntPointer = NULL; // for safety sake 
    return 0; 
} 
+0

no. no. él quiere saber cómo hacerlo usando una macro de Visual Studio que se puede ejecutar cuando se toca un punto de interrupción, sin modificar el código. – Chubsdad

+0

Una buena respuesta, sin embargo, el OP está pidiendo ayuda para escribir/grabar una macro de Visual Studio. – Dennis

+0

como han dicho otros, quiero una macro de Visual Studio (nada que ver con Excel o #define) – Tim

0

Puede ejecutar una macro VS cuando se golpea un punto de ruptura (breakpoints abrir la ventana, haga clic derecho en el punto de interrupción en cuestión, y seleccionar "cuando es golpeado ..." del menú emergente) Sin embargo, estoy menos seguro de escribir una macro que modifique una variable del programa en depuración. Nunca he hecho eso, y un intento rápido con intentar grabar una macro para hacerlo no parece funcionar (todo registros está activando la ventana derecha, sin cambiar el valor).

+0

sí, traté de grabar una macro para hacer "Ctrl-Alt-Q", pero dejó de grabar cuando apareció la ventana. – Tim

+0

@Tim: ¿Sería posible agregar una línea o dos para hacer la asignación en el código? –

+0

Estoy tratando de encontrar una manera que no obligue a una recompilación completa. Sin embargo, encontré la manera de hacerlo, así que lo compartiré. – Tim

4

Buscando similares hoy y descubriendo que también puede usar la opción 'Imprimir un mensaje:' en lugar de una macro. Los valores del código se pueden imprimir colocándolos dentro de {}. La clave es que VS también evaluará el contenido como una expresión, por lo que {variable_name = 0} debería lograr lo mismo que el ejemplo de macro.

0

Seleccione "Condición ..." y escriba una asignación para la variable en cuestión en el cuadro de texto "Condición:". Esto naturalmente se resolverá como "verdadero" ya que no es una prueba condicional real. Por lo tanto, nunca se golpea el punto de interrupción, y su variable se ha configurado en consecuencia.

+0

Lo probé y recibí un regalo: No se puede establecer el punto de interrupción. Esta expresión tiene efectos secundarios y no se evaluará. – sergiol

Cuestiones relacionadas