【问题标题】:Debugging all events in Visual Studio 2010 without setting break points在不设置断点的情况下调试 Visual Studio 2010 中的所有事件
【发布时间】:2010-10-20 13:32:46
【问题描述】:

我正在尝试调试具有大量事件的 Windows 窗体应用程序:按钮按下、计时器等。

有没有办法在不设置断点的情况下捕获应用程序正在执行的每一行代码?

编辑: 程序不是我写的,所以对代码不熟悉。我希望单步执行整个程序,捕获正在执行的每一行代码。在每个事件中设置断点是不切实际的,因为各种控件是动态创建的。

【问题讨论】:

  • 调试是将注意力集中在几个特定点上,而不是在你问我的时候打破每一条指令。

标签: c# debugging breakpoints


【解决方案1】:

在不设置断点的情况下调试按钮点击:

  1. 使用调试器启动应用程序。
  2. 立即进入预期点击之前的状态。
  3. 返回调试器并按 Pause,然后按 F11(Step Into)——什么都不会发生。
  4. 转到应用程序并按下按钮 - 调试器应接管并将您放入事件处理程序。

注意:如果处理了 Paint、任何鼠标事件或可能的其他一些事件,这将不起作用。每当您尝试上述步骤时,调试器都会将您放入这些处理程序中。

【讨论】:

  • 不敢相信我没有使用“Break All”——这正是我所需要的。
  • 暂停是什么意思?我只看到一个Break All 按钮,这对你的方法不起作用。
  • @Dgrin91:这是 3.5 年前的事了,但是 那行不通 并没有多大帮助。也许有一个新问题。
  • @AustinSalonen 根据您的要求:stackoverflow.com/questions/22696787/…
  • @AustinSalonen => 谢谢你的步骤。我只需要稍作修改以使其适合我。 1. 使用调试器启动应用程序或附加到进程 2. 转到预期单击之前的步骤 3. 在 VS2010 上单击 Break All (Ctrl + Alt + Break) 或“||”在调试工具栏上。 3. 返回应用程序并单击按钮 4. 返回调试器并使用“Step into” (F11) 选项。 Visual Studio 在事件处理程序方法处中断。
【解决方案2】:

如果您使用的是 Visual Studio 2010 的终极版,则可以使用其名为 IntelliTrace(以前称为历史调试器)的新功能。这将使您能够完全按照您的意愿行事 - 能够查看程序执行期间发生的所有方法调用和事件,并且您将能够跳回到您需要的事件。

要启用 IntelliTrace,请转到 Tools → Options → IntelliTrace,选中“启用 IntelliTrace”复选框,然后选择以下两种模式之一:“仅限事件”或“事件和调用信息”,然后使用调试器运行您的应用程序 (F5 )。

两种模式的区别在于后者使用分析器收集所有运行时信息,所以你得到一个完整的调用堆栈,但是你将无法使用edit-and-继续调试器的功能。

您可以在此series of articles 中找到更多信息,当然也可以在 MSDN 上找到。

【讨论】:

  • 这听起来对我来说是完美的解决方案。专业版可以用吗?我目前正在研究这个并将更新
  • 很遗憾,这只是 Visual Studio Ultimate 提供的功能之一 :(
  • 另外,我相信你可以下载trial version of Ultimate
  • 这就是我现在正在做的事情:) 我对“时间旅行”功能特别兴奋。如果启用了智能跟踪,您是否仍然能够同时单步执行代码?
  • 是的,IntelliTrace 是一个调试时功能,我相信您可以使用 F10 正常单步执行代码。
【解决方案3】:

您也可以尝试使用代码覆盖工具。

例如,如果您有 ResharperdotCover,您可以运行您的应用程序(通过 dotCover->Cover Application... 菜单项),当应用程序完成时,dotCover 将显示哪些代码行通过以绿色突出显示它们在 VS IDE 中运行。未运行的代码行以红色显示。

我不知道是否有其他工具可以做到这一点,但这是一种选择。

【讨论】:

    【解决方案4】:

    我开发了Runtime Flow 工具来解决这个问题——通过实时函数调用监控来了解一个庞大的不熟悉的.NET 代码库。它类似于 IntelliTrace,但更强调控制流而不是调试。

    【讨论】:

      【解决方案5】:

      你为什么要在每一行都打断?这将非常繁重且耗时。如果您想查看程序执行时的活动,请使用日志记录机制或Debug.Writeline 将信息输出到“立即”窗口。

      【讨论】:

      • 我误用了调试这个词。程序不是我写的,所以对它的操作不熟悉。我希望能够逐行查看它的工作原理。
      • 可以在执行的第一行设置断点,然后逐行单步执行(不记得键盘快捷键了。)
      • 我可能做错了。但根据我的经验,这不会捕获在不使用断点的情况下在事件中运行的代码。
      【解决方案6】:

      您无法跟踪代码行,但您可以使用Trace.TraceInformation 调用来了解执行了什么。还有Debug.Write。两个输出都会写入 Visual Studio 的输出窗口。

      另一种解决方案是将日志记录添加到您的应用程序中,例如使用 log4net,但这可能超出您的需求。

      【讨论】:

        【解决方案7】:

        这并不完全符合您的要求,但如果您不知道可以打开或关闭现有断点。在您的情况下,您可以在整个代码的关键位置添加断点,并在您不想调试它们时禁用它们。这样,您可以在以后想再次使用它们时重新启用它们。

        可通过“调试”>“窗口”>“断点”菜单(CTRL+D、B)下的“断点”窗口进行启用/禁用。您还可以在窗口中包含“功能”和“文件”列,这可能有助于您确定哪些断点位于您关心的事件处理程序中

        【讨论】:

          【解决方案8】:

          并非如此,但您可以通过其余代码设置一个断点和单步 (F10/F11)。

          【讨论】:

          • 感谢您的快速回复。但问题是我无法捕获在事件中运行的代码
          • @Ying - 您需要在方法事件处理程序中设置断点(除非我错过了您的阅读)
          • 问题是这个解决方案非常不切实际,因为程序又大又复杂
          • 您可以在所有事件处理程序上以编程方式设置断点 - 参见例如 stackoverflow.com/questions/841782/…
          【解决方案9】:

          不,不怕 - 你需要自己设置每个断点。

          如果有帮助,F9 是分配断点的快捷键 - 只需在每个方法的开头设置一个断点,然后从那里使用单步执行 (F10) / 单步执行 (F11)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-11
            • 1970-01-01
            • 2018-02-08
            • 2011-06-13
            • 2011-01-16
            • 2011-07-02
            • 1970-01-01
            相关资源
            最近更新 更多