19

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

4

6 回答 6

6

EDIT: tested only with C++

I came across this article that shows how to set a breakpoint at the beginning of every method in a class. I've tested it with VS 2010. The basic process (when using Visual C++) is:

  1. Go to Debug > New Breakpoint > Breakpoint at Function (Ctrl + B).
  2. In the Function field, insert MyClass::*
  3. This will show up as a single breakpoint in the Breakpoints window, but as soon as one of MyClass's methods is hit, you'll see a breakpoint at the beginning of every function in MyClass, and all of these will be "children" of the original breakpoint in the Breakpoints window.

I imagine this works with C# as well.

于 2013-08-28T06:38:24.900 回答
4

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

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

为班级中的每个成员添加断点

于 2013-02-09T19:42:49.473 回答
1

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

  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布尔值的地方插入一个手动断点。


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

于 2016-02-25T15:12:00.560 回答
0

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

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

 System.Diagnostics.Debugger.Break()

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

于 2013-02-08T09:06:53.183 回答
0

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

于 2019-02-05T16:37:01.257 回答
-1

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

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

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

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

于 2013-02-07T12:46:50.217 回答