2010-10-06 2 views
6

che sto debug di un'applicazione (C++), e ho trovato un punto nel codice in cui voglio cambiare un valore (tramite il debugger). Quindi in questo momento, ho un set di punto di interruzione, dopo di che lo faccio:Macro di breakpoint di Visual Studio per modificare un valore?

  • debugger raggiunge breakpoint
  • modifico la variabile che voglio cambiare
  • mi ha colpito F5 per continuare l'esecuzione
  • schiuma, risciacquare, ripetere

Sta colpendo molto questo punto di interruzione, quindi mi piacerebbe automatizzare questo. Vorrei impostare il punto di interruzione per eseguire una macro e continuare l'esecuzione.

Tuttavia, non ho esperienza di scrittura di macro VisualStudio, quindi non so i comandi per la modifica di una variabile del programma in esecuzione. Mi sono guardato intorno, ma finora non ho trovato nulla di utile online.

+0

come si desidera modificare la variabile? per esempio. incrementare un contatore. – Dennis

+0

Ho un puntatore e desidero impostarlo su NULL – Tim

risposta

12

ho trovato come farlo con una macro. Inizialmente, ho provato ad utilizzare Ctrl-Shift-R per registrare una macro di tasti, ma si è fermato la registrazione quando ho fatto Ctrl-Alt-Q. Ma sono stato in grado di modificare la macro per farlo funzionare. Quindi ecco cosa ho fatto, nel caso in cui qualcun altro volesse fare qualcosa di simile.

  • Strumenti -> Macro -> Macro Explorer
  • tasto destro -> Nuovo macro

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

Questa macro eseguirà l'istruzione di assegnazione, impostando la mia variabile (in questo caso, rendendolo un puntatore NULL).

  • Fare clic destro su un punto di interruzione -> quando viene colpito ...
  • Check "Esegui una macro"
  • Selezionare Macros.MyMacros.RecordingModule.setvalue
  • Check "Continua l'esecuzione"
  • Fare clic su OK

Quindi, sono stato in grado di eseguire il mio programma, regolando automaticamente un puntatore su NULL mentre andava. Questo è stato molto utile per i test e non ha richiesto la ricompilazione.

+0

Non più vero in Visual Studio 2015 :( –

-1

Se si pensa a una macro come Microsoft excel, allora si è fuori di vista. Non funziona in questo modo.

In C++, una macro si riferisce ad una piccola funzione linea creata con #define. È un preprocessore, quindi una macro è come usare una sostituzione su tutti i suoi riferimenti con il suo corpo.

Ad esempio:

#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); 
} 

auspica che il compilatore C++ come:

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

Ora, tornando alla tua domanda. Se la variabile è nel campo di applicazione a questo punto di interruzione, è sufficiente impostare dal all'interno del codice:

myVar = myValue; 

Se non lo è, ma è garantito per esistere, potrebbe essere necessario un piccolo hack. Dì che questa variabile è un int, crea un puntatore globale int. Se questa variabile è statica, assicurati di impostarla sul suo indirizzo e torna a NULL all'interno del suo ambito. Se è dinamico, potrebbe essere necessario un lavoro extra. Ecco un esempio:

int* globalIntPointer; 

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

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

no. no. vuole sapere come farlo usando una macro di Visual Studio che può essere eseguita quando viene colpito un punto di interruzione, senza modificare il codice. – Chubsdad

+0

Una buona risposta, tuttavia l'OP chiede aiuto per scrivere/registrare una macro di Visual Studio. – Dennis

+0

come altri hanno detto, voglio una macro di Visual Studio (niente a che fare con Excel o #define) – Tim

0

È possibile eseguire una macro VS quando un punto di interruzione viene colpito (aprire la finestra punti di interruzione, fare clic destro sul punto di interruzione in questione, e selezionare "Quando Hit ..." dal menu a comparsa). Sono meno sicuro di scrivere una macro che modifichi una variabile del programma in fase di debug - non l'ho mai fatto, e un tentativo veloce di provare a registrare una macro per farlo non sembra funzionare (tutto record sta attivando la finestra di destra, non cambiando il valore).

+0

sì, ho provato a registrare una macro per fare "Ctrl-Alt-Q", ma ha smesso di registrare quando è comparsa la finestra. – Tim

+0

@Tim: sarebbe possibile aggiungere solo una o due righe per eseguire l'assegnazione nel codice? –

+0

Sto cercando di trovare un modo che non costringa a ricompilare completamente. Ho trovato un modo per farlo, quindi lo condividerò. – Tim

4

In cerca di simili oggi e ho scoperto che è anche possibile utilizzare l'opzione 'Stampa un messaggio:' invece di una macro. I valori del codice possono essere stampati inserendoli all'interno di {}. La chiave è che VS valuterà anche il contenuto come espressione - quindi {variable_name = 0} dovrebbe ottenere lo stesso risultato dell'esempio macro.

0

Selezionare "Condizione ..." e scrivere un'assegnazione per la variabile in questione nella casella di testo "Condizione:". Questo naturalmente si risolverà in "vero", non essendo un test condizionale vero e proprio. Pertanto, il punto di interruzione non viene mai raggiunto e la variabile è stata impostata di conseguenza.

+0

Ho provato e ricevuto un regalo: Il punto di interruzione non può essere impostato. Questa espressione ha effetti collaterali e non verrà valutata. – sergiol