14

それを行うマクロはありますか?どのDTEオブジェクトを使用しますか?

4

8 に答える 8

18

(これはあなたが求めているものとはまったく異なりますが、ほとんど:)

[新しいブレークポイント] ダイアログを表示して次のように入力すると、Visual Studioのクラスのすべてのメンバー関数にブレークポイントを設定できます。

CMyClass::*

http://blogs.msdn.com/b/habibh/archive/2009/09/10/class-breakpoint-how-to-set-a-breakpoint-on-ac-class-in-the-visual-studioを参照してください。詳細については、 -debugger.aspxを参照してください。

于 2010-07-30T10:29:21.787 に答える
6

以下は、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
于 2008-12-10T22:17:48.130 に答える
2

使用するDTE関数はわかりませんが、ほとんどそれを実行できるマクロを非常に簡単に記録できます。

  1. ファイルの先頭に移動します
  2. ctrl --shift --R(録音開始)
  3. ctrl-I(インクリメンタルサーチ)
  4. {(最初の{文字を検索します)。
  5. F9(ブレークポイントの設定)
  6. ctrl-](一致する}文字に移動)
  7. ctrl --shift --R(録音を停止)

ここで、ファイルの最後に到達するまで、これを繰り返し実行します(ctrl-Pを繰り返しシフトします)。

名前空間がある場合は、4。を次のように変更します。

  1. ((関数定義の先頭で「(」を検索)
  2. esc(インクリメンタルサーチを停止)
  3. ctrl-I(再度インクリメンタルサーチ)
  4. {(関数本体の開始)

この種のものは、コードベースに合わせて無限に変更できます

于 2008-10-01T22:25:19.457 に答える
2

コンスタンティンの方法のように...これはwindbgの領域のようです。

あなたは cpp を持っているので (何かスクリプトを書くことができなかったとしても)、 Windows 用のデバッグ ツールの一部であるロガーを使用しても問題はないはずです... これは非常に便利なツールです。これを使って。

豊富なシンボリック情報、フック/プロファイリング/柔軟なインストルメンテーションを使用して、ロガー デバッグの C/COM/C++ を簡単に実行できます。

Logger をアクティブ化する 1 つの方法は、CDB または WinDbg を開始し、通常どおりユーザー モードのターゲット アプリケーションにアタッチすることです。次に、!logexts.logi または !logexts.loge 拡張コマンドを使用します。これにより、現在のブレークポイントにコードが挿入され、ターゲット アプリケーション プロセスで Logexts.dll をロードして初期化するルーチンにジャンプします。これは、「Logger をターゲット アプリケーションに注入する」と呼ばれます。

于 2009-05-12T23:05:32.263 に答える
1

WinDbg で同様のことを実現する方法を次に示します。

bm mymodule!CSpam::*

CSpamこれにより、 module 内のクラス (または名前空間) のすべてのメソッドにブレークポイントが設定されますmymodule

Visual Studio でこの機能に近いものをまだ探しています。

于 2008-10-09T19:30:43.623 に答える
0

これを行う1つの方法は次のとおりです(ハックであることを警告します):

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);
}
于 2016-05-15T20:47:40.847 に答える
0

マクロはありますが、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
于 2013-11-26T08:01:34.910 に答える
-1

これをファイルの先頭に置きます。

#define WANT_BREAK_IN_EVERY_FUNCTION

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

次に、次のように、すべての関数の先頭に DEBUG_BREAK を挿入します。

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

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

デバッグ中断が不要になったら、その行をコメント化します

// #define WANT_BREAK_IN_EVERY_FUNCTION

ファイルの上部にあります。

于 2008-10-02T03:59:37.593 に答える