我有一个更大的(c#)WPF应用程序n-classes
和m-methods
。我想在每个方法中放置一个断点,所以每当我按下我的应用程序中的按钮或任何方法被调用时,我希望VS2010中的应用程序能够达到该断点。我想了解应用程序的流程/进度。
由于我有很多方法,我宁愿不在每个人手动放置一个断点。
是否有任何命令或工具可以在我的VS2010解决方案的任何地方放置断点?
修改:可能类似于以下插件:http://weblogs.asp.net/uruit/archive/2011/08/04/visual-studio-2010-addin-setting-a-class-breakpoint.aspx
edit2 :有一些答案,但它们似乎都不是简单直接的解决方案。还有什么吗?
答案 0 :(得分:5)
编辑:仅使用C ++进行测试
我遇到了this article,它展示了如何在类的每个方法的开头设置断点。我已经使用VS 2010对其进行了测试。基本过程(使用Visual C ++时)是:
MyClass::*
MyClass
的某个方法被命中,您就会在开头看到一个断点MyClass
中的所有函数,以及所有这些函数都是 Breakpoints 窗口中原始断点的“子元素”。 我想这也适用于C#。
答案 1 :(得分:4)
This answer建议一个可以按照你的要求做的宏,但我个人的建议是使用一个分析器 - 一个可以让你暂停和恢复分析的功能(几乎所有的商业分析器都可以) ,然后在单击按钮之前点击“开始分析”按钮。在分析器中查看调用树通常是一种非常方便的方式,可以深入了解应用程序正在做什么,而不仅仅是在调试器中逐步完成。
更新:此功能存在于我正在处理的名为OzCode的Visual Studio扩展程序中。使用OzCode,当您单击类定义旁边的图标时,您将看到QuickAction:
答案 2 :(得分:0)
我认为您使用以下工具为其创建“方面”:postsharp
面向方面编程允许您将代码添加到每个方法的开头或结尾(通过后处理步骤)。所以添加这一行是微不足道的:
System.Diagnostics.Debugger.Break()
到每个方法(没有实际编辑所有源代码)。 更典型的是,它用于将日志语句添加到每个方法的开头,例如:“输入方法DrawLine(x = 30,y = 80,z = 12)”并在方法结束时:“离开方法DrawLine(x, Y,Z)”。这使得您的程序流程变得轻松
答案 3 :(得分:0)
使用简单的文本替换,这是一种快速而又脏的方法:
Edit
>中执行此操作Advanced
> Format Document
Ctrl+H
"^ {"
。" {System.Diagnostics.Debugger.Break();"
Alt+A
如何工作:这使用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++
中肯定会有一个快速添加的方法,但我不确定通过简单的命令行可以快速简便地实现这一点。