14

Is there a macro that does it? Which DTE objects to use?

4

8 回答 8

18

(这不是你所要求的,但几乎是:)

您可以在 Visual Studio中的类的每个成员函数上放置一个断点,方法是打开New Breakpoint对话框并输入:

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

I don't know what DTE functions to use, but you could very simply record a macro that could pretty much do it:

  1. Go to the top of the file
  2. ctrl - shift - R (start recording)
  3. ctrl - I (incremental search)
  4. { (search for the first { character).
  5. F9 (set breakpoint)
  6. ctrl - ] (go to matching } character)
  7. ctrl - shift - R (stop recording)

Now just run this over and over (ctrl - shift P repeatedly) until you reach the end of the file.

If you have namespaces, then change 4. to:

  1. ( (search for "(" at the start of the function definition)
  2. esc (stop incremental search)
  3. ctrl - I (incremental search again)
  4. { (start of function body)

This kind of thing can be infinitely modified to suit your codebase

于 2008-10-01T22:25:19.457 回答
2

就像康斯坦丁的方法......这似乎是windbg的领域。

既然你有cpp,(即使你没有编写脚本来解决问题),使用windows调试工具的记录器部分应该没问题......这是一个非常方便的工具,可惜人很少用它。

记录器调试的 C/COM/C++ 轻松,具有丰富的符号信息,钩子/分析/灵活的仪器;

激活 Logger 的一种方法是启动 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

有一个宏,但我只用 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 回答
0

这是一种方法(我警告你这是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);
}
于 2016-05-15T20:47:40.847 回答
-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 回答