Visual Studio 一直以来有个强大的功能IntelliTrace,我们可以称之为软件运行中的时间机器,可以方便的帮助开发人员,在开发环境重现系统运行的现场,从而发现和解决问题,十分强大。一直以来就有很多开发人员想把它用到生产环境中,去捕获实际的系统问题,这次在Visual Studio 11中,终于可以实现了,下面我们就试一下它的强大功能。
在具体操作前,我们先来回顾一下IntelliTrace的运行原理,下面的截图有个基本的理论基础,IntelliTrace的运行需要有一个运行中数据的收集计划(CollectionPlan.xml),它记载了我们重点关心哪些数据,这些信息将来会被收集起来;有了要收集的内容,适当的时候启动了IntelliTrace,他的系统记录器就会以一种插针的方式在应用中收集数据;数据收集后,生成一个IntelliTrace的信息文件,这里记录了所有选择的调用堆栈信息和程序运行信息;通过这个IntelliTrace的信息文件,只要你有这个应用,就可以在开发环境中重新系统运行的当时情况,通过前进、后退等功能在系统中跟踪程序问题的细节,并结合调试发现系统运行中的问题。
知道了这些基本原理,我们就可以试一下Visual Studio 11强大的IntelliTrace for Production功能了。
首先下载IntelliTrace Collector for Visual Studio 11,这已经是一个单独的产品了,下载地址在http://www.microsoft.com/visualstudio/11/zh-cn/downloads#intellitrace-collector。下载安装后只有9M左右大小,十分的轻便,可以用到生产系统上。
下面就是配置数据收集计划了,这是通过一个XML文件来实现的,具体配置内容可以参见http://blogs.msdn.com/b/visualstudioalm/archive/2011/09/15/modifying-an-intellitrace-collection-plan-for-the-stand-alone-collector.aspx这里有一个详尽的介绍。但是更省事的方式是使用Visual Studio中的配置界面(Tools ->Options ->Intellitrace),配置后会存储到C:Program Files (x86)Microsoft Visual Studio 11.0Common7IDECommonExtensionsMicrosoftIntelliTrace11.0.0en下面的collectionplan.xml。呵呵,我们选择了关注的事件,直接用它就好了。
安装IntelliTrace完毕,我们也有了Collectionplan.xml的数据收集计划了,下面我们可以使用IntelliTrace,但需在PowerShell模式下,所以系统需要安装PowerShell,这里不赘述,安装好后用Import-Module c:IntelliTraceMicrosoft.VisualStudio.IntelliTrace.PowerShell.dll命令,导入IntelliTrace的PowerShell命令,可以看到所有IntelliTrace相关的命令了。
下面就可以根据需要启动IntelliTrace,进行数据收集了,我用Start-IntelliTraceCollection “FabrikamFiber.Extranet.Web”
C:IntelliTraceLogsc:IntelliTracecollectionplan.xml启动了IntelliTrace,其中的第一个参数是应用程序池名。其中后,就会在collectionplan.xml的指定目录中生成数据文件,由于IntelliTrace记录了很多系统运行的堆栈细节,所以增长会很快,你可要留好了硬盘了啊!
数据收集的差不多了,我们可以通过Stop-IntelliTraceCollection“FabrikamFiber.Extranet.Web” 结束数据收集,记住一切数据收集都是有代价的,我的机器在开启了IntelliTrace后,增加了200M的内存使用。
我们来看一下收集的结果把,到指定目录,发现了生成的Itrace数据文件,我们就可以用它来进行调试了,帮助我们重新系统出现问题的现场,具体调试的细节请参见http://msdn.microsoft.com/en-us/library/dd264915(v=vs.110).aspx。
个人使用感受,IntelliTrace for Production真是一个很牛的功能,尽可能少的系统代价前提下,可以帮助收集到大量的系统信息,特别是可以直接在开发环境重现生产环境的问题,并可以调试重入,大大的解决了生产系统问题无法重新导致的系统问题,有给了我们.net开发者一个有效的利器去保障系统的可靠运行。