【问题标题】:Can I set breakpoints to all methods in a class at once in Visual Studio?我可以在 Visual Studio 中一次为类中的所有方法设置断点吗?
【发布时间】:2012-07-24 07:03:03
【问题描述】:

我在一个类中有 40-50 个方法,我想为所有方法添加断点。我可以一次给所有的断点添加吗?

【问题讨论】:

    标签: visual-studio-2010 debugging breakpoints


    【解决方案1】:

    这里描述了一个无插件的方法: How to set a breakpoint on a C++ class in the Visual Studio Debugger

    简而言之,您可以通过按 Ctrl+K、B 并在函数字段中输入 ClassName::* 来调出“新建断点”对话框。在 Visual Studio 2017 中,您需要在字段中包含命名空间,如 NamespaceName::ClassName::*。 然后,您可以在断点窗口中禁用其中的一些。

    【讨论】:

    • 只是一个更新:它在 vs 2017 中确实有效,我只是这样做了。但是,您“可能”需要提供完整的限定条件,包括命名空间。
    • 您知道使用 Visual Studio Professional 2012 为 VB.net 中的类中的所有函数设置断点的语法是什么吗?我试过 NamespaceName.ClassName.* 但它没有用。谢谢。
    • @vt.不适用于我的命名空间。 “完全资格”是什么意思?
    • 我正在使用 mvs 2017 并在新函数断点中编写 excat 相同的命令“NamespaceName::ClassName::*”,但没有发生任何事情。
    • Ctrl-K B 用于 VS-2019 开箱即用的新功能断点。 Ctrl-B 用于构建项目。也不要将此与 Ctrl-K Ctrl-B 混淆,后者是代码片段管理器...请社区检查/确认并相应更新答案。
    【解决方案2】:

    这是您的宏,但在 1000 多个函数上设置断点需要一段时间...而且它会降低 Visual Studio 的速度!

    Sub BreakAtEveryFunction()
        For Each project In DTE.Solution.Projects
            SetBreakpointOnEveryFunction(project)
        Next project
    End Sub
    
    
    ' Macro editor
    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
    

    【讨论】:

    • 要让这个脚本在 VS 2012 中工作,您可以将函数复制到一个新的 Addin 项目中,并在 Addin 项目的“OnConnection”方法中调用“BreakAtEveryFunction”。该脚本有点过于全面,因为它使用了 .NET 方法,而且到处都有错误,Addin 项目会抱怨“DTE.Debugger”和“DTE.Solution.Projects”,将“DTE”更改为“_applicationObject” .有关 Addin 项目的更多信息,请参阅This answer.
    【解决方案3】:

    您可以尝试使用class breakpoint add-in,或者您可以使用replace expression 在每个方法的开头添加__debugbreak()

    【讨论】:

    • 您能否详细说明答案的第二部分?
    【解决方案4】:

    由于某种原因,接受的答案对我不起作用。而且我认为我的解决方法不适用于 Visual Studio 2010。但我在 Visual Studio 2015 中使用了 Macros for Visual Studio 扩展来执行此操作。

    步骤:

    1. 为方法的左大括号找到 (Ctrl+F) 右缩进。通常是 8 个空格(或 2 个制表符等,具体取决于您所做的设置)。
    2. 使用左大括号 { 附加此内容。
    3. 在前面加上\r\n 以确保它不匹配任何嵌套的大括号。现在它可能看起来像\r\n {。此外,打开正则表达式搜索(通过在搜索对话框中按 *)。
    4. 开始录制宏。
    5. F3 然后按 F9 添加断点。这会为使用该技巧找到的第一个方法添加一个断点。
    6. 停止录制宏。根据您可能拥有的方法进行播放。
    7. 注意:当你到达终点时要小心。否则它将从顶部重新开始,并开始删除您刚刚添加的断点。

    如果有任何混淆,请告诉我。

    【讨论】:

      【解决方案5】:

      如果您使用 vim (vsvim),您可以相当轻松地操作断点。以下是一些示例。

      在每一行打断:{Escape}qq:vsc Debug.ToggleBreakpoint{Enter}jq100@q

      打破每个方法:

      {Escape}qq:vsc Edit.NextMethod{Enter}:vsc Debug.ToggleBreakpoint{Enter}jq100@q

      将 100 替换为适当数量的行/方法。

      示例: https://imgur.com/SFhlEr7

      【讨论】:

        【解决方案6】:

        单击“调试”选项卡并选择“全部调试”。然后调用您要调试的方法/控制器/函数,并使用调试器单步执行(不要继续,除非您设置了断点)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-05
          • 1970-01-01
          • 2015-02-08
          • 2011-02-06
          • 2021-07-19
          相关资源
          最近更新 更多