2008-10-01 6 views

Répondre

2

Je ne sais pas ce que les fonctions à utiliser DTE, mais vous pouvez très simplement enregistrer une macro qui pourrait le faire à peu près:

  1. Aller en haut du fichier
  2. ctrl - changement - R (début de l'enregistrement)
  3. ctrl-I (recherche incrémentale)
  4. {(recherche du premier {caractère).
  5. F9 (set point d'arrêt)
  6. ctrl -] (aller à la correspondance} caractère)
  7. ctrl - changement - R (enregistrement arrêt)

Maintenant, il suffit d'exécuter encore et (ctrl - changement P à plusieurs reprises) jusqu'à la fin du fichier.

Si vous avez des espaces de noms, puis modifiez 4.:

  1. ((rechercher "(" au début de la définition de la fonction)
  2. esc (arrêt progressif recherche)
  3. ctrl - I (recherche incrémentale nouveau)
  4. {(début du corps de la fonction)

Ce genre de chose peut être modifiée à l'infini en fonction de votre base de code

+0

J'ai des espaces de noms anonymes, cela fonctionnera-t-il? (Ne pas avoir VS pour le moment à vérifier) ​​ – Constantin

+0

En fait (ignorer mon commentaire précédent), il serait évidemment ignorer le code à l'intérieur de l'espace de noms. Essayez le changement que j'ai édité en –

+0

Impossible de faire fonctionner ceci dans VS 2010 - la recherche incrémentale est désactivée pendant l'enregistrement d'une macro. –

0

Mettre cela en haut du fichier:

#define WANT_BREAK_IN_EVERY_FUNCTION 

#ifdef WANT_BREAK_IN_EVERY_FUNCTION 
#define DEBUG_BREAK DebugBreak(); 
#else 
#define DEBUG_BREAK 
#endif 

puis insérez DEBUG_BREAK au début de chaque fonction, comme ceci:

void function1() 
{ 
    DEBUG_BREAK 
    // the rest of the function 
} 

void function2() 
{ 
    DEBUG_BREAK 
    // the rest of the function 
} 

Lorsque vous ne voulez plus les pauses de débogage, commentaire la ligne

// #define WANT_BREAK_IN_EVERY_FUNCTION 

en haut du fichier.

+1

Je voudrais une solution automatisée non intrusive. Je pourrais aussi bien appuyer sur F9 dans chaque fonction. – Constantin

1

Voilà comment quelque chose de similaire pourrait être atteint dans WinDbg:

bm mymodule!CSpam::* 

Cela met dans chaque point d'arrêt méthode de classe (ou espace de noms) CSpam dans le module mymodule. Je cherche toujours quelque chose près de cette fonctionnalité dans Visual Studio.

5

Voici une mise en œuvre rapide de l'idée de 1800 INFORMATION:

Sub TemporaryMacro() 
    DTE.ActiveDocument.Selection.StartOfDocument() 
    Dim returnValue As vsIncrementalSearchResult 
    While True 
     DTE.ActiveDocument.ActiveWindow.Object.ActivePane.IncrementalSearch.StartForward() 
     returnValue = DTE.ActiveDocument.ActiveWindow.Object.ActivePane.IncrementalSearch.AppendCharAndSearch(AscW("{")) 
     DTE.ActiveDocument.ActiveWindow.Object.ActivePane.IncrementalSearch.Exit() 
     If Not (returnValue = vsIncrementalSearchResult.vsIncrementalSearchResultFound) Then 
      Return 
     End If 
     DTE.ExecuteCommand("Debug.ToggleBreakpoint") 
     DTE.ExecuteCommand("Edit.GotoBrace") 
     DTE.ActiveDocument.Selection.CharRight() 
    End While 
End Sub 
+0

+1, mais ne peut pas accepter, car il ne fonctionne pas avec les espaces de noms. – Constantin

+2

Si vous rencontrez des problèmes avec les espaces de noms, commentez simplement la première ligne qui va au début du document. Vous devrez placer manuellement le curseur au début du bloc que vous voulez basculer, mais cela fonctionnera. – tfinniga

2

méthode est comme Constantin ... Cela semble WinDBg territoire.

Puisque vous avez le cpp, (même si vous ne pouviez pas écrire quelque chose), il ne devrait pas y avoir de problème pour utiliser logger une partie des outils de débogage pour Windows ... c'est un outil très pratique, honte si peu de gens l'utilisent. Logger le débogueur C/COM/C++ facilement, avec des informations symboliques riches, crochets/profilage/instrumentation flexible;

One way to activate Logger is to start CDB or WinDbg and attach to a user-mode target application as usual. Then, use the !logexts.logi or !logexts.loge extension command. This will insert code at the current breakpoint that will jump off to a routine that loads and initializes Logexts.dll in the target application process. This is referred to as "injecting Logger into the target application."

+0

Nice stuff! ---- – Constantin

+0

J'ai voulu en savoir plus à ce sujet, j'ai un problème lors du chargement et je veux voir le contexte de cette duplication supposée se produire pour certaines exceptions de google protobuf. – jxramos

0

Il existe une macro, mais je l'ai testée uniquement avec C#.

Sub BreakAtEveryFunction() 
For Each project In DTE.Solution.Projects 
    SetBreakpointOnEveryFunction(project) 
Next project 
End Sub 


Sub SetBreakpointOnEveryFunction(ByVal project As Project) 
Dim cm = project.CodeModel 

' Look for all the namespaces and classes in the 
' project. 
Dim list As List(Of CodeFunction) 
list = New List(Of CodeFunction) 
Dim ce As CodeElement 
For Each ce In cm.CodeElements 
    If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then 
     ' Determine whether that namespace or class 
     ' contains other classes. 
     GetClass(ce, list) 
    End If 
Next 

For Each cf As CodeFunction In list 

    DTE.Debugger.Breakpoints.Add(cf.FullName) 
Next 

End Sub 

Sub GetClass(ByVal ct As CodeElement, ByRef list As List(Of CodeFunction)) 

' Determine whether there are nested namespaces or classes that 
' might contain other classes. 
Dim aspace As CodeNamespace 
Dim ce As CodeElement 
Dim cn As CodeNamespace 
Dim cc As CodeClass 
Dim elements As CodeElements 
If (TypeOf ct Is CodeNamespace) Then 
    cn = CType(ct, CodeNamespace) 
    elements = cn.Members 
Else 
    cc = CType(ct, CodeClass) 
    elements = cc.Members 
End If 
Try 
    For Each ce In elements 
     If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then 
      GetClass(ce, list) 
     End If 
     If (TypeOf ce Is CodeFunction) Then 
      list.Add(ce) 
     End If 
    Next 
Catch 
End Try 
End Sub 
+1

Alors que ce lien peut répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. –

+0

@SahilMittal merci, corrigé. – alexkovelsky

+0

Intéressant, bien que normalement je ne mette pas de code C# dans les fichiers .cpp. Je me demande si cela fonctionne aussi pour C++. – Constantin

0

Voici une façon de le faire (je vous préviens, il est hacky):

EnvDTE.TextSelection textSelection = (EnvDTE.TextSelection)dte.ActiveWindow.Selection; 
// I'm sure there's a better way to get the line count than this... 
var lines = File.ReadAllLines(dte.ActiveDocument.FullName).Length; 
var methods = new List<CodeElement>(); 
var oldLine = textSelection.AnchorPoint.Line; 
var oldLineOffset = textSelection.AnchorPoint.LineCharOffset; 
EnvDTE.CodeElement codeElement = null; 
for (var i = 0; i < lines; i++) 
{ 
    try 
    { 
     textSelection.MoveToLineAndOffset(i, 1); 
     // I'm sure there's a better way to get a code element by point than this... 
     codeElement = textSelection.ActivePoint.CodeElement[vsCMElement.vsCMElementFunction]; 
     if (codeElement != null) 
     { 
      if (!methods.Contains(codeElement)) 
      { 
       methods.Add(codeElement); 
      } 
     } 
    } 
    catch 
    { 
     //MessageBox.Show("Add error handling here."); 
    } 
} 

// Restore cursor position 
textSelection.MoveToLineAndOffset(oldLine, oldLineOffset); 

// This could be in the for-loop above, but it's here instead just for 
// clarity of the two separate jobs; find all methods, then add the 
// breakpoints 
foreach (var method in methods) 
{ 
    dte.Debugger.Breakpoints.Add(
     Line: method.StartPoint.Line, 
     File: dte.ActiveDocument.FullName); 
} 
Questions connexes