用户如何修复他们的代码中的 Bug?您设置一些断点、在调试器下运行程序 、进行一点单步调试 – 并祈求能够轻而易举地发现问题,这样您就能继续处理 其他事情。
几乎自 ENIAC 发明以来,我们就一直在进行着同样方式的调试。这种繁琐而 耗时的调试方法为我们提供了很好的帮助,但是时候使调试更加轻松了。随着 Visual Studio 2010 Ultimate 的发布,新的 IntelliTrace 功能使开发人员能 够更深入地了解应用程序的执行情况,从而使调试进入了 21 世纪。
与其他监视和跟踪工具(例如 Windows Sysinternals 中的 Process Monitor)非常类似,Visual Studio 2010 在应用程序执行时收集有关应用程序 的数据,来帮助开发人员诊断错误。收集的数据称为 IntelliTrace 事件。这些 事件将在默认调试过程中收集,此外,它们使开发人员能够进行回溯以查看应用 程序中发生的情形,而不必重新启动调试器。
在本文中,我将向您介绍 IntelliTrace,并演示它如何在开发人员的日常开 发活动中体现出价值。我将演示 IntelliTrace 如何提供在应用程序执行过程中 所发生事件的时间线,以及开发人员如何能够使用这些事件来帮助调试。接着, 我将论述一些设置,开发人员可以更改这些设置来收集有关应用程序的一组更深 层的信息,从而获得完整的执行历史记录。最后,我将演示如何使用其他人(测 试人员)创建的以前记录的 IntelliTrace 文件来调试应用程序,而不必运行应 用程序来重现错误。
当 Visual Studio 诊断团队开始规划 Visual Studio 2010 时,我们花费了 很多时间与客户讨论,了解客户如何诊断其应用程序中的问题。尽管每个人都有 不同的方式和喜欢使用的工具集,但有一点是绝对清楚的:传统的应用程序问题 诊断方法困难、耗时而且成本高昂。开发人员收到的 Bug 报告几乎从没有任何 用于重现问题的步骤,并且大部分都是由像“我正在使用程序,突然间程序崩溃 了”这样的语句组成。即使在极个别的情况下提供了有效的重现步骤,也可能会 在特定的环境中出现 Bug,而这又会导致出现一组需要解决的全新问题。而且, Bug 通常是由于误解了框架或其他代码的运行方式而导致的。
考虑到这些难题,我们着手创建了一个新的调试器功能,用于在问题发生时 收集到正确的信息。我们的目标是为开发人员提供准确的重现步骤和系统环境设 置,以及公开他们所使用的框架和代码的行为,从而大幅提高可诊断性。随着 Visual Studio 2010 Ultimate 的发布,IntelliTrace 使开发人员能够更深入 地了解应用程序和框架行为,并能够打开由测试人员收集的 IntelliTrace 文件 来解决“无法重现”的情况,从而大大改善了调试体验。
IntelliTrace 简介
当开发人员需要更深入地了解代码执行情况时,IntelliTrace 提供了一种“ 加速调试”的方式来收集应用程序的完整执行历史记录。
为了阐释这一点,我将使用 Tailspin Toys 演示应用程序来演示 IntelliTrace 可收集的信息类型。首先,我将在 Visual Studio 中打开解决方 案并启动调试。当网站启动时,我将导航到“关于我们”页,并收到来自服务器 的错误。如何才能诊断问题?如果您像我一样,则您首先想到的是配置 web.config 文件以不显示自定义错误,然后重新启动调试器。但如果此问题是 间歇性的,又将如何呢?如果您可以在错误发生后就在此时进入进程,并从 Visual Studio 中获得应用程序中所发生情形的历史记录,是不是很好?
当您进行调试时,IntelliTrace 将在后台收集有关托管应用程序的数据,其 中包括来自许多框架组件(例如 ADO.NET、ASP.NET 和 System.XML)的信息。 这些 IntelliTrace 事件使开发人员能够查看先前在执行过程中发生的情况,并 且最重要的是,能够进行“回溯”以查看应用程序的先前状态,而不必重新启动 调试器。当我进入调试器时,我立即看到了按顺序列出的以前收集的 IntelliTrace 事件(请参见图 1)。
图 1 IntelliTrace 收集的诊断信息
正如您可从图 1 中看到的,IntelliTrace 事件的列表不仅仅局限于您在 Process Monitor 中看到的文件和注册表访问。我们为 Visual Studio 2010 定 义了将近 150 个 IntelliTrace 事件,并计划随着时间的推移用其他事件扩充 此列表。图 2 重点列出了一些 IntelliTrace 所收集事件的类别。
图 2 IntelliTrace 事件可跨 Microsoft .NET Framework 使用
类别 | 描述和收集的数据 |
ADO.NET | 与针对 SQL 执行查询、执行的命令以及连接字符串相关的事件。 |
MVC | 与 ASP.NET 管道以及请求处理和重定向相关的事件。 |
控制台 | 控制台输出。 |
数据绑定 | Windows 窗体数据绑定。 |
环境变量 | 对进程中的环境变量进行求值和检索。 |
文件 | 创建、删除和访问文件。 |
手势 | 用户对 Web 窗体、Windows 窗体和 WPF 中的常见控件执行的操作。 除了收集有关与控件的交互的数据之外,单击其中一个事件还会自动将您重定向 到相应的事件处理程序。 |
迟缓初始化 | 初始化延迟加载的变量。 |
注册表 | 创建、删除和查询注册表信息。 |
服务模型 | 从 WCF 中进行的 Web 服务调用。 |
线程处理 | 用户工作项和并行计算任务的排队。 |
跟踪 | 调试器跟踪输出和断言。 |
用户提示 | 显示 Windows 窗体和 WPF 消息框以及对话框的结果。 |
工作流 | 实例化和完成活动。 |
XML | XML 文件加载。 |