如何在VS2010中的每个方法中设置断点

时间:2013-02-07 12:19:33

标签: c# visual-studio-2010 debugging

我有一个更大的(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 :有一些答案,但它们似乎都不是简单直接的解决方案。还有什么吗?

6 个答案:

答案 0 :(得分:5)

编辑:仅使用C ++进行测试

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

  1. 转到调试>新断点>功能断点(Ctrl + B)。
  2. 功能字段中,插入MyClass::*
  3. 这将在 Breakpoints 窗口中显示为单个断点,但只要MyClass的某个方法被命中,您就会在开头看到一个断点MyClass中的所有函数,以及所有这些函数都是 Breakpoints 窗口中原始断点的“子元素”。
  4. 我想这也适用于C#。

答案 1 :(得分:4)

This answer建议一个可以按照你的要求做的宏,但我个人的建议是使用一个分析器 - 一个可以让你暂停和恢复分析的功能(几乎所有的商业分析器都可以) ,然后在单击按钮之前点击“开始分析”按钮。在分析器中查看调用树通常是一种非常方便的方式,可以深入了解应用程序正在做什么,而不仅仅是在调试器中逐步完成。

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

Add Breakpoint to every member in class

答案 2 :(得分:0)

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

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

 System.Diagnostics.Debugger.Break()

到每个方法(没有实际编辑所有源代码)。 更典型的是,它用于将日志语句添加到每个方法的开头,例如:“输入方法DrawLine(x = 30,y = 80,z = 12)”并在方法结束时:“离开方法DrawLine(x, Y,Z)”。这使得您的程序流程变得轻松

答案 3 :(得分:0)

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

  1. 格式化您的C#文件,以便排列所有缩进。您可以在Edit>中执行此操作Advanced> Format Document
  2. Ctrl+H
  3. 打开文本替换
  4. "^ {"
  5. 设置为“要查找的文字”字段
  6. 将“替换”字段设置为此" {System.Diagnostics.Debugger.Break();"
  7. 点击窗口中的“使用正则表达式”按钮
  8. 点击“全部替换”或点击Alt+A
  9. 如果您的文件包含嵌套枚举,类或结构的任何类,则会出现一些编译器错误。从代码中删除Debug调用,直到代码编译完毕。如果您的嵌套类有自己的方法,则必须在替换字符串中使用更多选项卡再次运行此过程。
  10. 如何工作:这使用Visual Studio文档格式化程序,并假定文件中的所有方法都以两个选项卡开头,然后是“{”。因此,任何以两个标签和“{”开头的行都会被相同的两个标签替换,相同的“{”和对调试器的调用。

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

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

    如果你想要禁用这些断点的能力,我能想到的最好的方法就是简单的bool。在代码的某处,插入:

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

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

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

    然后,当您点击断点并且不想再点击时,在观察窗口中键入此内容并按Enter _ignoreDebug = true。要重新打开它,您需要在可以访问_ignoreDebug bool的地方插入手动断点。

    要从代码中删除所有这些内容,请执行其他文本替换,或者只修改撤消所有内容。

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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

这样的事情可能是你在范围内设定的布尔?

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

notepad++中肯定会有一个快速添加的方法,但我不确定通过简单的命令行可以快速简便地实现这一点。