在Visual Stuido 2010中有一个新的功能那就是IntelliTrace.IntelliTrace被引入到Visula Studio中来加速我们对.NET应用程序的调试,它通过对预先设置的事件和方法在运行过程中的跟踪并将其有效地传递给调试执行者,从而快速的传递程序在执行过程中的状态和各种信息来帮助开发者更好的调试程序,快速的发现问题。实际上,在Visual Studio 2010之前,Microsoft Visual Stuido已经帮助我们很好的继承了调试工具,比如对变量的监控,对堆栈的查看等等,并且允许设置断点进行单步调试等。所有的这些都在很好的帮助开发者来了解程序在不同的执行过程中的状态以及检测是否按照预先实际的逻辑进行运转,而且更多的,我们通过断点后监测程序状态来发现问题所在。而这样所存在的问题是,一些逻辑上的错误可能发生在断点执行之前,而且很可能是一些无法追查。开发者必须停止当前的调试,重新设置断点并启动调试,而这样的试验过程往往需要很多次才能找到正确的位置来设置断点。
IntelliTrace都收集哪些数据?
那么IntelliTrace带给我们了什么?顾名思义,它智能的将一些调试信息和程序状态自动的跟踪并实施的展现给开发人员,从而减少了需要程序员找到适当的断点才能跟踪和监控程序运行状态的过程。那么这些信息到底有什么用呢?IntelliTrace又到底搜集了哪些数据呢?这取决于我们通知IntelliTrace进行收集的数据类型和对其大小的控制,这样IntelliTrace会按照我们期望的方式去收集部分数据而不是所有在即时调试过程中的程序状态信息。Visual Studio提供给我们两个方式来控制其搜集信息的内容源,一个是IntelliTrace events only,仅仅收集智能跟踪事件和调试中断的相关数据;另外一个是IntelliTrace events and call information,这个就会收集除了IntelliTrace事件之外对一个方法调用的进入和退出的各种数据。下边我们来看看在Visual Studio 2010中如何设置IntelliTrace的跟踪选项。
首先我们需要检查IntelliTrace功能在Visual Stuido 2010中是打开的。在Visual Studio 2010中选择”Tools | Options…”打开选项对话框,并选择”IntelliTrace | General”. 确保Enable IntelliTrace是被选中的。
Figure 1: Visual Studio 2010 IntelliTrace settings.
默认情况下,IntelliTrace仅仅收集IntelliTrace相关的事件,这样是为了保持所收集的数据较少,并且对于性能上的影响是最小的。而当你选择对方法调用的数据也进行搜集时,除了其临时搜集的数据所占用空间的增大外,对于性能的影响也是较大的。尽管收集到的细节有所不同,但两种方式都会收集一些共同的数据。比如,它总会在第一次启动收集过程时收集系统信息,模块的加载和卸载事件,线程的起始和结束时间等。随着模块和线程的事件,可以正确的更新模块和线程调试窗口的信息。另外,任何模式下,在调试断点处也会对数据进行收集,并将所收集到的基本数据类型和对象在调试其中进行检查和审阅,并允许改变其值。
Figure 2:IntelliTrace in Visual Studio 2010
IntelliTrace Events
那么什么是IntelliTrace事件呢?简单的说就是程序员在调试程序的过程中可能会感兴趣的特定的点。例如打开一个文件,更改注册表信息,点击表单上的某个按钮,甚至于数据绑定等等。IntelliTrace的事件会以竞争的方式来最终决定被放置的位置,但是这个位置不能是过于频繁的被调用而可能导致程序性能明显降低的地方。
当你用Visual Studio 2010打开一个项目并且启用IntelliTrace功能时,当调试器在断点停下时你会看到IntelliTrace的信息。下图是我在设置了对文件的访问作为IntelliTrace事件时IntelliTrace搜集的数据:
Figure 3: 对IntelliTrace事件相关数据的收集
如何去更改IntelliTrace事件呢?对于默认的IntelliTrace events,文件访问是不被纳入的。但你可以通过对IntelliTrace的设置来改变对你感兴趣的事件信息的收集,来加速你的程序调试。选择”Tools | Options… | IntelliTrace | IntelliTrace Events”,在右边的列表中选择感兴趣的事件即可。
Figure 4:配置IntelliTrace事件
需要注意的是,添加的事件越多,IntelliTrace需要收集的数据就会越多,提供给你的信息就越多,而且数据占用的空间也会越多。这是需要权衡的,尤其是对于特别大的项目,一旦你的设置过于繁琐,可能会让机器处于严重的停滞状态。另外,在Modules选项中,你还可以通过多模块的过滤来达到只收集你最关心的数据程序状态的目的,这样避免了IntelliTrace对所有组件的相关事件都进行收集的情况。
Figure 5:设置IntelliTrace跟踪的模块
IntelliTrace到底可以帮助我们做什么?
在Advanced选项中,可以定义每次智能跟踪的数据的存储大小和位置。IntelliTrace会收集在调试过程中程序的运行状态,这些状态存到哪儿,以什么样的方式存储呢?答案就在Advanced选项。
Figure 6:IntelliTrace数据的存储位置和大小
首先可以选择跟踪的数据的存储位置,默认是存储在C:\ProgramData\Microsoft Visual Studio\10.0\TraceDebugging位置并以每个跟踪文件最大250M的方式存储为.iTrace文件。位置和对于每个文件的大小都可以做调整。那么iTrace文件到底是什么呢? iTrace文件是一个可以被Visual Studio所识别的文件,它记录了本次跟踪过程中程序执行的时间线,线程,异常,系统信息和相关模块。
Figure 7:IntelliTrace文件的信息
有意思的是,这和你在IntelliTrace窗口中看到的信息是一致的,并且可以随时映射到所对应的调试会话中。例如,在Exception Data部分,当我们发现一个异常时,我们可以清楚的看到这个异常的信息以及详细的Call Stack。
Figure 8:IntelliTrace对程序调试的帮助
双击异常,或者点击异常下方的Start Degugging按钮可以恢复此次跟踪所对应的调试会话,并直接定位到异常位置。并且在右边的IntelliTrace窗口中可以完整而清楚的看到此次程序运行过程中各种事件的相关数据,以此来更清楚的还原现场并帮助找出问题。
Figure 8:IntelliTrace帮助定位问题及还原现场
至此我们终于知道了IntelliTrace不仅仅只是给我们收集了数据,更是为我们将这些数据与程序状态和各个事件相关联,快速的帮助我们定位问题,以此来加速程序调试。其实在Microsoft Test Manager中也适用了IntelliTrace技术来帮助我们做相关测试,但这是后话。
IntelliTrace events and call information
当设置IntelliTrace不仅跟踪相关的事件,并且跟踪对每个方法的访问时你可以清楚的看到整个程序在运行过程中是如何对不同的方法及对象进行实例化、相互调用,线程调度的时间线等等。好比描绘了一个程序的流程图,让你可以清楚的在各个调用间导航来找到你感兴趣的信息。并且,随着在Call View窗口中在不同的调用间导航,你可以清楚的知道每一次调用所对应的位置(除部分不可见的Code外),以此来更好的了解程序流程。
Figure 9:通过Call View窗口来观察程序中的方法调用
IntelliTrace是一个帮助我们更好的调试程序,发现问题并解决问题的工具,并且还可以灵活的定义对于所感兴趣的事件和数据的收集,将会在开发过程中扮演越来越重要的角色。另外,你还可以自己定义IntelliTrace的事件呢。怎么样,快去使用它吧:)