用 IntelliTrace 调试应用程序

 

[原文作者]:Justin Marks

[原文链接]:Debugging Application with IntelliTrace

下载示例代码

     人们是如何修正代码中的Bug的?设置一个断点、在调试器里运行程序、进行一些单步执行–并祈祷这问题是在你的控制范围内, 然后你才能干些事情

    自从ENIAC(世界第一台积分电子计算机)被发明以来我们一直就是这么Debug的了。这种乏味而耗时的Debug办法到目前为止我们用得还行,不过,现在是让Debug变得简单些的时候了。随着 Visual Studio 2010 Ultimate 的发布,新的 IntelliTrace 功能通过让程序员们能更好的洞察他们的应用程序的运行,把调试事业带入了21世纪。

    跟 Windows SysInternals 的 Process Monitor 之类的其它监视和跟踪工具很像,Visual Studio 2010 会搜集一个应用程序在运行时的数据,以帮助程序员们去诊断错误。这些搜集到的数据被称作 IntelliTrace 事件。这些事件 被搜集为默认调试经验的一部分,加上别的部分,它们让程序员们可以不需要重启debugger就可以穿越到运行时去看看应用程序里面发生了什么事情。

    在这篇文章中,我将向你介绍 IntelliTrace,并为你演示作为日常开发活动一部分,它是如何为程序员们提供好处的。我将展示 IntelliTrace 是如何提供一个那些在一个应用程序运行时发生事件们的时间线,以及程序员们可以如何使用这些事件去做有针对性的调试。然后,我将谈到那些“为了搜集关于应用程序的一系列更深入的信息,以得到一个完整的运行时历史”而可以被程序员改动的设置。最后,我将演示如何使用一个以前由别人–比如一个测试人员–建立的 IntelliTrace 记录文件去调试一个应用程序,而不用去运行该应用程序以重现错误。

    当 Visual Studio 评估团队开始为 Visual Studio 2010 做计划的时候,我们花费了大量的时间与客户讨论他们是如何诊断他们的应用程序中的问题的。尽管每个人都有自己的一套方式以及偏爱的工具,但是有一点却是压倒性的清楚:传统的诊断应用程序中问题的方法既困难、耗时又代价高昂。程序员们收到的Bug报告几乎从来也没有任何重现问题的步骤,大多数就是由象“我正在使用这个程序,但是它突然Crash了”这样的句子组成。在极少数有重现步骤的情况下,你也可能会面对 Bug 发生在特殊环境下的问题,而这又会导致一些需要解决的新问题。此外,bug常常是因为对一个 framework 或者别的代码是如何运作的误解而产生的。

    明确了这些要点之后,我们有了一个新的调试器功能的构想:它需要能够在问题发生的时候就搜集到正确的信息。我们的目标是交给程序员准确的重现步骤、系统环境设置、以及公布他们使用的 framework 或者代码的行为,以彻底的提高程序的可诊断性。随着 Visual Studio 2010 Ultimate 的发布,IntelliTrace 通过让程序员们能够更好的洞察应用程序和 framework 的行为、以及打开一个由测试人员搜集的 IntelliTrace文件去解决“没有重现步骤”的情况的能力,为我们带来了调试体验的极大提高。

IntelliTrace 介绍

    当一个程序员需要对代码运行的一个更深入的理解时,IntelliTrace提供了一种可以“调高(仪表的)刻度”的办法来搜集一个应用程序的完整运行时历史。

为了阐明它,我将使用 Tailspin Toys 示例应用程序来为你演示 IntelliTrace 可以搜集哪些类型的信息。我将在 Visual Studio 中打开这个 Solution 并开始调试。当这个 Web 站点启动的时候,我将浏览到 “About us” 页,然后就会收到一个服务器错误。那么你会怎么诊断这个问题呢?如果你象我这样,那么本能的第一反应可能是去设置web.config文件以禁用显示自定义错误,然后重启调试器。可如果这个问题是断断续续无规则的出现的呢?如果你能够在问题出现的时间点上断入进程,在错误发生后,能够从 Visual Studio 获得一个发生在应用程序中的事件的历史,这样是不是很不错?

当你在调试的时候,IntelliTrace 会在后台搜集一个托管应用程序的数据,包括来自许多像 ADO.NET、ASP.NET、以及System.XML之类的 framework 部件的信息。这些 IntelliTrace 事件让程序员可以查看在运行时曾经发生过什么事情,以及更重要的:“穿越时空”去查看应用程序之前的状态而不需要重启调试器。当我打开调试器的时候,马上看到了一个被搜集到的 IntelliTrace 事件的有序列表,如图1:

clip_image001

图1 IntelliTrace 搜集的诊断信息

    从图1中你可以看到,这个IntelliTrace事件的列表所包含的内容远远超过你在 Process Monitor 中能看到的文件和注册表访问。我们已经为 Visual Studio 2010 定义了将近150种 IntelliTrace 事件,而且已经有计划日后增加更多的事件。图2强调了一些由IntelliTrace搜集的事件的类别:

图2 在 Microsoft .NET Framework 上可用的 IntelliTrace 事件

类别

说明和被搜集的数据

ADO.NET

与执行SQL查询有关的事件,被执行的命令以及连接字符串

ASP.NET

与ASP.NET管道(pipeline)有关的事件,以及请求的处理和重定向

Console

控制台输出

Data Binding

WinForm数据绑定

环境变量

从进程中取回和运算出环境变量

文件

文件的建立、删除和访问

手势(Gestures)

用户在Web表单、Windows Form和WPF上对常用控件执行的操作。除了搜集关于与控件交互的数

用Visual Studio 2010收集使用,性能和稳定性信息来改进软件

 

[原文作者]:Beth Massi

[原文链接]:Using Visual Studio 2010 to Collect Usage, Performance and Stability Information to Improve Software

内容

Dotfuscator被认为是生成后代码插入的平台

一个具体的例子

   在Visual Studio 2010里面,Dotfuscator CE新的官方名字是“Dotfuscator软件服务-社区版”重命名是为了强调它在这次发布中更集中于作为一个生成后工具。一个全新的基于代码插入特性和服务的类库被加了进来,产品有了新的风格,重新组织和简化了用户接口,加强了可用性和创新性。最后,对于传统的你已经在使用的功能,也有一些改进。这篇文章中,我会给你介绍新代码插入的特性。用这些特性可以帮助你生成更好的软件,并且更快。

Dotfuscator被认为是生成后代码插入的平台

    作为一个工具,Dotfuscator已经可以进行重要的程序分析和二进制代码的转变,Dotfuscator在独特的位置中,它可以在生成后的阶段有一些加值,而不用改动任何源代码。在这之前,Dotfuscator专业版已经有了这些功能,所以我很高兴从Visual Studio 2010开始,Dotfuscator社区版也参加了这个俱乐部。Dotfuscator社区版现在增加了下面的功能:

对象跟踪: 检查什么程序被执行了,这些程序的什么版本,多长时间。

特性使用跟踪:检查什么特性在被使用,在什么情况下,多长时间。

程序过期:编码一个过期日期,当程序过期后还在被使用就传送一个警告,并且终止过期的程序对象。我们把这个叫做“保存期限”。

篡改防御:检测篡改过的程序的执行,传送事件警告,并且终止篡改过的程序的运行。

   在服务器端,有一个免费版本的运行时智能服务门户 free.runtimeintelligence.com。发送对象跟踪,特性使用,和其他提醒给这个免费服务,在配置Dotfuscator代码插入的时候,只需选择免费的终结点作为你的消息的终点。(下面我会展示怎么去做。)当你用公司的ID号码登录到这个门户网站,你可以看到你的程序发送过来的数据。

一个具体的例子

    让我们用Dotfuscator社区版新的功能来给“hello world”这个例子程序添加特性分析。这个例子程序被默认安装在你的%Program File%\Microsoft Visual Studio 10.0\PreEmptive Solutions\Dotfuscator Community Edition\Samples文件夹下面。因为在普通用户对这个文件夹通常不可写,所以我建议建一个工作区域在你的“Documents”文件夹下面,然后拷贝HelloWorld.exe 和hello_config.xml到这个文件里面。他们分别是输入程序和相关的Dotfuscator的配置文件。

    当你做好上面的步骤之后,从Visual Studio的工具菜单栏打开“Dotfuscator Software Services”,然后通过Dotfuscator File-〉Open Project menu打开hello_config.xml文件。

配置特性分析法

    点击右边的Instrumentation结点导航到Instrumentation编辑器,见图1。

    点击Options,然后钩选“Enable Instrumentation”和“Send application analytics messages”。这个告诉Dotfuscator去插入代码,当程序在跑的时候用来收集特性的使用数据。

clip_image001

图1:在Visual Studio 2010中配置Dotfuscator 特性分析法

     你通过标签来配置实际的代码的插入。标签可以用.NET的用户标签内置在源代码中(定义在PreEmptive.Attributes.dll里面,在dotfuscator的安装目录下面)。或者,你不想修改源代码,可以用“extended attributes”,这些是Dotfuscator来维护的,存放在dotfuscator的配置文件中。这是我们将会在例子中使用的方法。

    第一,在程序集的水平上,我们会加两个标签用来标识和集合你的程序产生的信息。选择Attribute,然后高亮显示Helloworld.exe程序集。右击它,并且选“Add Attribute”。在Add Attribute对话框中,选择ApplicationAttribute和BusinessAttribute,然后点击OK(如图2)。

clip_image002

图2:在程序集水平上添加程序和业务标签

    BusinessAttribute有一个CompanyKey,它是一个独一无二的值用来标识程序的创建者。等会你可以用这个值来登录免费的Runtime Intelligence Services Portal去看你的数据。你可以点击关联这个CompanyKey的入口区域的“…”按钮,生成一个新的独一无二的值。你也可以设置CompanyName关联这个CompanyKey。这个不是必须的,名字可以用来个性化这个门户网站。见图3。

clip_image003

图3:自动生成的CompanyKey是程序的唯一的标识符, CompanyName不是必须的,帮助个性化你的程序

    同样的,ApplicationAttribute有一个GUID属性,用来标识插装的程序。点击关联这个GUID属性的“…”按钮,生成一个程序的标识符。你可以让其他的ApplicationAttribute属性空白。

    现在是时候添加两个attribute到Main方法里面,写在HelloWorld.Hello类里面的。用instrumentation的编辑器的类浏览方式导航到那个类,右击Main方法,然后选择Add Attribute。选择Setup和Teardown标签,然后点击OK(如图4)。

clip_image004

图4:添加Setup和Teardown标签到Main方法里面

    Setup标签应该放在当程序开始时调用的那个方法上面。当Dotfuscator运行时,他插入初始化代码到加了标签的方法中,Main方法通常是一个好的备选项,但不是必须的,它需要是一个在任何消息被发送之前调用的方法。配置S
etupAttribute,唯一的属性你需要去设置的就是Custom Endpoint,程序发送的所有的消息的一个远程终点。点击“…”按钮激活Custom Endpoint对话框,然后选择“PreEmptive’ Free Runtime Intelligence Services”作为终结点。(见图5)

clip_image005

图5:选择ProEmptive’s Free Runtime Intelligence Services 作为Runtiem Intelligence消息的终结点

    TeardownAttribute也可以被放在Main方法里面,通常,它应该被放在程序结束时,在所有消息发送完毕之后调用的那个方法,Dotfuscator插入清理代码在被加标签的方法里面。因为HelloWorld.exe是一个单线程的控制台程序,把Teardown标签加载Main方法里面是可行的,因为代码最后执行的也是Main方法。

    现在我们已经标识了程序和规定的终结点,我们现在可以加上使用分析了。HelloWorld是一个简单的程序,打印Hello和Goodbye—我们感兴趣的时候,多久这两个特性会被使用。

    Hello特性是在HelloWorld.Friendly.SayHello类里面的实现的。通过instrumentation的编辑器导航到这个方法。跟之前一样,右击然后激活Add Attribute对话框,但是这次,选择Feature Attribute。FeatureAttribute告诉Dotfuscator到哪去插入分析收集代码。这个这个标签名字的属性为“SayHello”(见图6)。你设置的这个名字会出现在分析的报告里面,所以选择一个可读性强的名字是非常重要的。设置FeatureEventType为“Tick”。这个告诉Dotfuscator,这个特性使一个“instantaneous“事件,相对于有停止和开始时间的事件。

clip_image007

图6:设置特性名字和特性事件类型,使得特性在门户网站上更易识别

    现在添加同样的标签到HelloWorld.Friendly.SayGoodbye类然后给这个特性的名字设置为“SayGoodbye”。配置工作现在就完成了,然后你已经可以去运行Dotfuscator,点击play 按钮或者按Ctrl-B去生成这个项目。 当你运行这个程序的时候,它会在它开始和停止的时候,和SayHello,SayGoodbye方法被执行的时候发送信息。

查看你的数据

    你可以用company key登录Free Runtime Intelligence Portal free.runtimeintelligence.com 来查看数据。一旦你登录,你就可以看到你的程序和特性仪表板回来问题,就像:

    哪个程序被使用最多? (图7)

clip_image008

图7:标识哪个程序被运行最多次

    程序被运行在什么操作系统上? (见图8)

clip_image009

图8:标识程序运行在什么操作系统上

    程序运行在什么CLR版本上?(见图9)

clip_image010

图9:程序运行在什么CLR版本上

    特性使用的频率? (见图10)

clip_image011

图10:特性使用的频率

    也有同样数据的表格样式( 见图11)

clip_image012

图11:表格样式的数据

    特性使用数据(见图12)

clip_image013

图12:表格样式的特性使用数据