【问题标题】:How to set a breakpoint in every method in VS2010VS2010如何在每个方法中设置断点
【发布时间】:2013-01-22 22:39:00
【问题描述】:

我有一个更大的 (c#) WPF 应用程序,带有 n-classesm-methods。我想在每个方法中放置一个断点,所以每次我在应用程序中按下按钮或调用任何方法时,我都希望 VS2010 中的应用程序能够命中该断点。我想了解应用程序的流程/进度。

由于我有很多方法,我不想手动在每个方法中放置一个断点。

是否有任何命令或工具可以在我的 VS2010 解决方案的任何地方放置断点?

编辑:可能类似于以下插件:http://weblogs.asp.net/uruit/archive/2011/08/04/visual-studio-2010-addin-setting-a-class-breakpoint.aspx

edit2:有一些答案,但似乎都不是直接简单的解决方案。还有什么?

【问题讨论】:

标签: c# visual-studio-2010 debugging


【解决方案1】:

您可以使用我的Runtime Flow 扩展来查看按下按钮后调用的所有方法,而无需设置断点。

【讨论】:

    【解决方案2】:

    这是一种使用简单文本替换的快速而肮脏的方法:

    1. 格式化 C# 文件,使所有缩进对齐。您可以在Edit > Advanced > Format Document 中执行此操作
    2. Ctrl+H打开文本替换
    3. 将此"^ {" 设置为“要查找的文本”字段。
    4. 将“替换”字段设置为此" {System.Diagnostics.Debugger.Break();"
    5. 点击窗口中的“使用正则表达式”小按钮
    6. 点击“全部替换”或点击Alt+A
    7. 如果您的文件中包含任何具有嵌套枚举、类或结构的类,则会出现一些编译器错误。从它们中删除 Debug 调用,直到您的代码编译。如果您的嵌套类有自己的方法,则必须在替换字符串中使用更多选项卡再次运行此过程。

    这是如何工作的:它使用 Visual Studio 文档格式化程序并假定文件中的所有方法都以两个选项卡开头,然后是一个“{”。因此,任何以两个选项卡和一个“{”开头的行都将替换为相同的两个选项卡、相同的“{”和对调试器的调用。

    如果你的文件有嵌套枚举等,你会得到编译器错误,因为文本替换不区分方法和枚举。例如,您会看到:

    enum MyColors
    { System.Diagnostics.Debugger.Break(); //error here
        Red,
        Green,
        Blue,
    }
    

    如果你想禁用这些断点,我能想到的最好方法是一个简单的布尔值。在你的代码中的某处,插入这个:

    #if DEBUG
            private static bool _ignoreDebug = false;
    #endif
    

    (我把#if DEBUG放在那里作为这个代码仅用于调试的标志。没有必要)然后在上面的步骤#4中,改用这个替换字符串:

    "        {if(!_ignoreDebug){System.Diagnostics.Debugger.Break();}"
    

    然后,当您遇到断点并且不想再点击时,在监视窗口中键入 this 并按 Enter _ignoreDebug = true。要重新打开它,您需要在可以访问 _ignoreDebug bool 的位置插入手动断点。


    要从您的代码中删除所有这些,请执行另一个文本替换,或者只是编辑撤消所有内容。

    【讨论】:

      【解决方案3】:

      This answer 建议使用一个可以按照您的要求执行的宏,但我个人的建议是改用分析器——它可以让您随时暂停和恢复分析(几乎所有商业分析器都这样做),并且然后在单击按钮之前点击“开始分析”按钮。在分析器中查看调用树通常是深入了解应用程序正在做什么的一种非常方便的方法,比在调试器中单步执行要多得多。

      更新:此功能存在于我正在开发的名为 OzCode 的 Visual Studio 扩展中。使用 OzCode,当您单击类定义旁边的图标时,您将看到 QuickAction:

      【讨论】:

      • @Salim 有很多不同的,JetBrains dotTrace 和 Red Gate ANTS 就是一些例子。请注意,我描述的技术仅适用于检测模式(记录每个方法条目),而不适用于分析器的采样模式,如果某些方法仅在很短的时间内执行,则可能不包括这些方法。
      【解决方案4】:

      编辑:仅使用 C++ 测试

      我遇到了this article,它展示了如何在类中每个方法的开头设置断点。我已经用 VS 2010 测试过了。基本流程(使用 Visual C++ 时)是:

      1. 转到调试 > 新断点 > 函数处的断点 (Ctrl + B)。
      2. 函数字段中,插入MyClass::*
      3. 这将在 Breakpoints 窗口中显示为单个断点,但一旦MyClass 的方法之一被命中,您将在每个函数的开头看到一个断点在MyClass 中,所有这些都将是 Breakpoints 窗口中原始断点的“子”。

      我想这也适用于 C#。

      【讨论】:

      • 感谢您的链接,但我无法用我的 c# 类重现相同的效果。没有断点。能否请您创建一个包含 2 种方法的小类并检查它是否也适用于 c#?
      • 经过一番搜索,我找到了this answer。其中一个 cmets 说此方法仅适用于 C++。为误导性答案道歉。
      【解决方案5】:

      我认为您可以使用以下工具为其创建一个“方面”:postsharp

      面向方面的编程允许您将代码添加到每个方法的开头或结尾(通过后处理步骤)。所以添加这一行是微不足道的:

       System.Diagnostics.Debugger.Break()
      

      每个方法(无需实际编辑所有源代码)。 更典型地,它用于将日志语句添加到每个方法的开头,例如:“输入方法 DrawLine(x=30,y=80,z=12)”和方法的末尾:“离开方法 DrawLine(x, y,z)”。这使您的程序流程变得容易

      【讨论】:

      • 有趣。我会调查的。
      【解决方案6】:

      您可以在进入您的方法时使用System.Diagnostics.Debugger.Break()

      类似这样的东西可能带有您在范围内设置的布尔值?

      #if DEBUG
        if (BreakPointEveryMethod)
          System.Diagnostics.Debugger.Break();
      #endif
      

      notepad++ 中肯定会有一种快速的方法来添加它,但我不确定是否有一种快速简便的方法可以让您通过简单的命令行来实现这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2022-07-25
        • 2018-08-08
        • 2017-02-26
        • 2011-04-03
        • 2011-01-12
        相关资源
        最近更新 更多