2010-10-06 18 views
6

Je débogue une application (C++), et j'ai trouvé un point dans le code où je veux changer une valeur (via le débogueur). Donc, en ce moment, j'ai un ensemble de point d'arrêt, après quoi je fais:Visual Studio Breakpoint Macro pour modifier une valeur?

  • Debugger atteint
  • breakpoint je modifie la variable que je veux changer
  • je frappe sur F5 pour continuer à exécuter
  • faire mousser, Rincez, répétez

Il tape beaucoup sur ce point d'arrêt, donc je voudrais automatiser cela. Je voudrais définir le point d'arrêt pour exécuter une macro et continuer l'exécution.

Cependant, je n'ai aucune expérience de l'écriture de macros VisualStudio, donc je ne connais pas les commandes pour modifier une variable du programme en cours d'exécution. J'ai regardé autour de moi, mais je n'ai rien trouvé d'utile en ligne jusqu'à présent.

+0

comment voulez-vous modifier la variable? par exemple. incrémenter un compteur. – Dennis

+0

J'ai un pointeur, et je veux le mettre à – Tim

Répondre

12

J'ai trouvé comment faire cela avec une macro. Initialement, j'ai essayé d'utiliser Ctrl-Shift-R pour enregistrer une macro de frappes, mais il a arrêté d'enregistrer quand j'ai fait Ctrl-Alt-Q. Mais j'ai été capable d'éditer la macro pour que ça marche. Donc, voici ce que j'ai fait, au cas où quelqu'un d'autre veut faire quelque chose de similaire.

  • Outils -> Macros -> Explorateur de macros
  • Clic droit -> Nouvelle macro

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

Cette macro exécutera l'instruction d'affectation, je crée mon variable (dans ce cas, ce qui en fait un pointeur NULL).

  • Cliquez droit sur un point d'arrêt -> Quand Hit ...
  • Cochez la case "Exécuter une macro"
  • Sélectionnez Macros.MyMacros.RecordingModule.setvalue
  • Cochez la case "Continuer l'exécution"
  • Cliquez sur OK

Ensuite, j'ai été capable d'exécuter mon programme, en ajustant automatiquement un pointeur sur NULL au fur et à mesure. Cela a été très utile pour les tests et n'a pas nécessité de recompilation.

+0

Ce n'est plus vrai dans Visual Studio 2015 :( –

-1

Si vous pensez à une macro de la même manière que Microsoft Excel, vous n'avez pas de chance. Ça ne marche pas comme ça.

En C++, une macro fait référence à une petite fonction en ligne créée aveC#define. C'est un préprocesseur, donc une macro est comme utiliser un replace sur toutes ses références avec son corps.

Par exemple:

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

Voudrait le compilateur C++ comme:

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

Maintenant, revenir à votre question. Si la variable est dans la portée à ce point d'arrêt, situé juste de l'intérieur de votre code:

myVar = myValue; 

Si ce n'est pas, mais il est garanti d'exister, vous devrez peut-être un petit hack. Dites que cette variable est un int, faites un pointeur global. Si cette variable est statique, assurez-vous de la définir sur son adresse et de revenir à NULL dans son étendue. Si c'est dynamique, vous aurez peut-être besoin de plus de travail. Voici un exemple:

int* globalIntPointer; 

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

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

NULL. non. il veut savoir comment le faire en utilisant une macro Visual Studio qui peut être exécutée quand un point d'arrêt est atteint, sans modifier le code. – Chubsdad

+0

Une bonne réponse, mais l'OP demande de l'aide pour écrire/enregistrer une macro Visual Studio. – Dennis

+0

comme d'autres l'ont dit, je veux une macro Visual Studio (rien à voir avec Excel ou #define) – Tim

0

Vous pouvez exécuter une macro VS lorsqu'un point d'arrêt est frappé (ouvrir la fenêtre des points d'arrêt, faites un clic droit sur le point d'arrêt en question, puis sélectionnez « Quand Hit ... » sur le menu contextuel). Je suis moins sûr d'écrire une macro qui modifie une variable du programme en cours de débogage - je n'ai jamais fait ça, et un essai rapide en essayant d'enregistrer une macro pour le faire ne semble pas fonctionner (tout ça records active la fenêtre de droite, sans changer la valeur).

+0

oui, j'ai essayé d'enregistrer une macro pour faire "Ctrl-Alt-Q", mais il a arrêté l'enregistrement quand la fenêtre est apparue. – Tim

+0

@Tim: Serait-il possible d'ajouter simplement une ligne ou deux pour faire l'affectation dans le code à la place? –

+0

J'essaie de trouver un moyen qui ne force pas une recompilation complète. J'ai trouvé un moyen de le faire, alors je vais partager ça. – Tim

4

Si vous cherchez des résultats similaires aujourd'hui, vous pouvez également utiliser l'option 'Imprimer un message:' au lieu d'une macro. Les valeurs du code peuvent être imprimées en les plaçant dans {}. La clé est que VS évaluera également le contenu en tant qu'expression - donc {variable_name = 0} devrait atteindre le même que l'exemple de la macro.

0

Sélectionnez "Condition ..." et écrivez une affectation pour la variable en question dans la zone de texte "Condition:". Cela se résoudra naturellement à "vrai" avec ce n'est pas un test conditionnel réel. Par conséquent, le point d'arrêt n'est jamais atteint et votre variable a été définie en conséquence.

+0

Je l'ai essayé et j'ai reçu un cadeau: Le point d'arrêt ne peut pas être défini Cette expression a des effets secondaires et ne sera pas évaluée. – sergiol