如何把断点在.cpp文件中的各项功能?(How to put breakpoint in every

2019-08-23 02:11发布

有没有做它的宏? 其中DTE对象使用?

Answer 1:

(这是你要求并不完全符合,但几乎:)

你可以把一个断点通过打开新建断点对话框,然后输入相应的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了解更多详情。



Answer 2:

这里有一个快速实施的1800信息的想法:

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


Answer 3:

我不知道是什么DTE功能使用,但你可以非常简单地录制宏,可以几乎做到这一点:

  1. 转至文件的顶部
  2. CTRL - 移位 - R(开始记录)
  3. CTRL - 我(增量搜索)
  4. {(搜索第一{字符)。
  5. F9(设置断点)
  6. CTRL - ](去匹配}字符)
  7. CTRL - 移位 - R(停止记录)

直到到达文件的结尾 - (移反复P CTRL)现在只要运行这个一遍又一遍。

如果你有命名空间,然后更改4.:

  1. ((搜索“(”在函数定义的开始)
  2. ESC(停止增量搜索)
  3. CTRL - 我(增量搜索再次)
  4. {(启动功能体)

这种东西可以无限修改,以适应你的代码



Answer 4:

像康斯坦丁的方法......这似乎是WinDbg的领土。

既然你有CPP,(即使你没有,你可以脚本的东西被弄),应该使用没有问题记录器的调试工具的一部分的Windows ...这是一个非常方便的工具,耻辱就这么几个人用它。

记录器调试的C / COM / C ++容易,具有丰富的象征性信息,钩/仿形/灵活的仪器仪表;

激活记录器的一种方法是启动CDB或WinDbg中和附加到用户模式目标应用程序如常。 然后,使用!logexts.logi或!logexts.loge扩展命令。 这将在当前断点,将跳下一个例行程序,加载并在目标应用进程初始化Logexts.dll插入代码。 这被称为“记录器注入到目标应用程序”。



Answer 5:

下面是类似的东西可以在WinDbg中实现:

bm mymodule!CSpam::*

这使断点类(或命名空间)的每个方法CSpam在模块mymodule

我仍然在寻找什么接近的Visual Studio此功能。



Answer 6:

你应该在文件的顶部:

#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

在文件的顶部。



Answer 7:

有一个宏观的,但我只用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


Answer 8:

下面就来做到这一点(我警告你,这是哈克)的一种方式:

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


文章来源: How to put breakpoint in every function of .cpp file?