在Visual Studio 2010中快速跟踪和调试.Net程序

本文来自 51CTO 网站 作者:黄永兵

 

介绍

IntelliTrace(智能跟踪)是微软在Visual Studio 2010中引入的一个新功能,旨在加快调试跟踪速度,它是通过减少开发人员的调试执行步骤减少调试时间的。

传统的调试程序允许开发人员在代码中设置一个断点,当调试程序命中这个断点时,执行过程就被暂停,这个时候,开发人员可以查看应用程序的状态快照,包括各种变量,调用堆栈等。调试程序也允许一步一步朝前跟踪应用程序的执行,但它不知道在此之前发生了什么,也就是不能回溯跟踪,因此程序前面执行时暴出某些逻辑错误也不能跟踪到,这个时候,开发人员不得不中断调试过程,重新在代码前面的某个位置设置一个新的断点,再重新开始调试。

IntelliTrace除了具有传统调试程序的功能外,它还可以向后一步一步回溯跟踪到错误的发生地,在Visual Studio 2010中启动调试会话后,IntelliTrace就开始收集数据,它在一个扩展名为.iTrace的文件中存储它收集到的数据,更酷的是可以将这个文件发给你另一个人,他可以在他的Visual Studio 2010环境中回顾这次会话。

我们还是以一个例子来看看IntelliTrace的详细用法,我们创建了一个Windows窗体应用程序(一个利息计算器),它需要接收来自用户输入的本金和持有天数,计算并显示利息,并在同一个窗体中显示最终的合计金额,除Windows窗体外,我们创建了两个组件,第一个组件处理持有时间,因此它是一个天数,第二个是数据访问组件,从数据库获取利息率,将其提供给第一个组件,根据计算,我们预计180到360天的利息率是4.5%,最高可达5%,当开发人员输入361到364天作为持有期时,返回的年利息率仍然是4.5%,我们需要调试代码揪出错误源。

调试前的准备工作

首先我们检查一下是否启用了IntelliTrace,点击“工具”*“选项”*“ IntelliTrace”,如下图所示:

图 1检查是否启用IntelliTrace

默认情况下,IntelliTrace只收集IntelliTrace事件数据,以保持数据最小化,为了了解默认启用了哪些IntelliTrace事件,请点击“IntelliTrace事件”子菜单。

图 2IntelliTrace事件列表

我们可以根据需要有选择性地选中列表中某些项目。接下来点击“模块”子菜单,在这里我们可以配置要收集哪些模块的数据,或排除哪些模块,默认情况下,所有微软默认创建的模块都被忽略掉,因为在我们的程序中这些模块不需要被跟踪。

图 3配置跟踪或排除哪些模块

有了这个配置功能后,我们返回到“常规”子菜单中,这时我们可以选择收集IntelliTrace事件和调用信息,如下图所示:

图 4设置调试时收集IntelliTrace事件和调用信息

接下来点击“高级”子菜单,我们发现,默认情况下,IntelliTrace将数据存储在“C:\Documents and Settings\All Users\Application Data\Microsoft Visual Studio\10.0\TraceDebugging”,为了以后复制方便,我们将其修改为“c:\ IntelliTrace Records”,这里需要注意的是IntelliTrace会为每个调式程序会话创建一个数据文件,它使用FIFO(先进先出)原则维护这些文件,当Visual Studio关闭时,它会删除所有文件,这意味着如果我们想要在Visual Studio关闭后仍然保留这些文件,必须在Visual Studio打开时进行复制。另外,我们也设置了每个数据文件的最大尺寸,如下图所示:

图 5设置IntelliTrace数据文件存储参数

在这里你应该看到有一个选项“调试时是否启用Navigation Gutter(导航条)”,在调试时可以通过它上面的图标做上下调用的切换,并可以通过它直接进入被调用的方法内部。

开始调试

至此,IntelliTrace设置完毕,我们可以按以往的调试方法开始调试了,我们设置本金为10000,持有期为361天,当我得到利息和合计金额时,我们发现利息率应该是5%。

图 6开始调试

在窗口右侧我们看到有一个文本链接“全部中断”(Break All),当我们点击该链接时,调试程序打开IntelliTrace窗口,并暂停了调试执行过程。

图 7调试过程暂停

点击上图中所示的“切换到调用视图”(Switch to call view)链接,显示调用信息,并在窗口左侧显示了一个导航图标。

图 8调用视图

当我们点击这个导航图标时,它打开导航条,导航到调用。

图 9打开导航条

导航条上显示了五个图标,它们的含义分别是(从上到下):

1、返回调用位置;

2、转入上一个调用或IntelliTrace事件;

3、在调用中前进一步(F11);

4、转入下一个调用或IntelliTrace事件;

5、切换到实时调试(Live Debugging)。

图 10切换到实时调试

现在我们就可以跨组件在方法调用中前进和后退了。

图 11调试时可前进和后退了

查看变量,Autos,Locals,Watches和调用堆栈的值,我们终于找到了问题的起因。

图 12查看Locals值

调试结束后的事情

现在我们停止调试程序,如果想保留由IntelliTrace存储的数据,直接打开前面配置的数据文件存放目录,将最新的数据文件拷贝到另一个文件夹中即可,拷贝完毕后就可以安全地关闭Visual Studio 2010了。

如果我们双击这个iTrace文件,系统会调用Visual Studio 2010来打开它。

图 13打开后的iTrace文件

如果我们在图中所示的线程列表中双击任一线程,Visual Studio就会重新打开该线程对应的会话。例如下图是我们在主线程上双击打开的会话,我们可以打开调用视图,设置调试上下文。

图 14重新打开的主线程会话

如果此时程序处于打开状态,我们可以继续在同一个会话中工作。

对于ASP.NET程序,IntelliTrace的工作方式基本相同,收集的事件更详细了。

图 15IntelliTrace 也支持调试ASP.NET应用程序

总结

IntelliTrace是一个彻底改变调试过程的功能,它提高了开发人员调试程序的效率,如果是一个很难检测到的bug,可以通过收集调试数据,保存到iTrace文件,将其发送给专家帮你调试。IntelliTrace的设置选项也非常丰富,允许我们按照自身的需求优化IntelliTrace会话。