试试用JetBrains dotTrace Performance调试Silverlight代码

本文介绍如何使用dotTrace工具进行性能调试,重点展示了dotTrace在Silverlight应用中的具体使用方法及案例分析。

概述

在.NET平台下常用的性能调试工具有WinDBG, ANTS Performance Profiler,JetBrains dotTrace Performance,CLR Profiler等。

WinDBG比较强大,但是也是用起来较为复杂的一种。WinDBG一般采用输入命令式的方式。WinDBG能查看当前应用内存中有多少对象。每个对象的地址,对象之间的依赖关系。以及能Dump出IL等。当我们看到某个类型的对象不应该有这么多,这个时候我们可以尝试随机Dump出某个对象的依赖关系。WinDBG功能强大在张银奎的《软件调试》一书中有详细的介绍。

ANTS Performance Profiler 和dotTrace 差不多都是采用拍摄内存快照的方式。这里主要介绍dotTrace在Silverlight中使用方法。

dotTrace使用方法

1. 下面使用dotTrace 4.0+VS2010调试Silverlight。dotTrace4.0可集成于VS2010中如图:

clip_image002

2.启动VS2010调试模式会启动VS2010虚拟IIS WebDev.WebServer40 clip_image004

3.点击VS菜单dotTraceàProfile Applicationà选择Silverlight Application 点击OKà输入我们要运行的URL地址 点击OK。

clip_image006clip_image008

clip_image010

4.dotTrace这样就启动了,默认是开启监控状态,即你现在的操作过程都会被dotTrace记录下来。如果整个过程被记录下来文件的内容会比较大,不便于我们查找我们需要的东西。点击clip_image012可以删除本段快照记录,点击clip_image014可以启动一个新的快照。点击clip_image016可以获取本段监控的文件并且打开文件。一同事说当在DataFrom(ToolKit控件)中编辑了数据后,当前Entity的一个属性State会改变成其它值,而且调试了半天没跟踪到时哪里改变了这个值。(由于代码封装层数过多运行的地方好多又是异步的,并且Entity是动态生成的。也许可能改变值的地方不是我们这边写的代码。所以给调试带来了许多的困难。我们项目组有一层代码是别的部门封装的,我们自己也无法调试进去,总之同事确定不是他自己这边的代码改变了这个属性的值)于是我们就将数据操作然后点击空白处这个过程监控下来。

5.如下图是dotTrace监控下来的一段快照,左边有Tread Tree,CallTree,Plain List,Hot Spots

image

。按Ctrl+F可以查找Class 和Function。

分析:当RowState的值变成Deleted了,一定会设置Entity的RowState,在.NET运行时候对属性的访问会生成一个set_属性名 这样的一个方法,输入set_RowState。果然clip_image020找到了set_RowState方法, 双击set_RowState会跳到这个方法的Call Tree

clip_image022

分析:我们可以清晰的看到在DataFromde CommitEdit-> QueryablecollectionView的CommitEdit->OnCollectionChanged->OnCollectionChanged ->RemoveRowsForOldEntities。很有可能就是这里RemoveRowsForOldEntities的时候将RowState作为了Deleted状态了。

那么为什么QueryablecollectionView的CommitEdit会触发OnCollectionChanged事件呢,我们知道OnCollectionChanged只有在集合Remove或者Add的时候才会触发,难道QueryablecollectionView的CommitEdit做了这个动作?

下面我们反编译QueryablecollectionView的CommitEdit方法

clip_image024

clip_image026

仔细看CommitEdit方法调用了RefreshOnItemAction方法。在RefreshOnItemAction方法中当布什分组状态和QueryablecollectionView的分页状态时 有removeArgs 和addedArgs,猜测这里肯定是先Remove了一个Entity,然后再Add了一个Entity。我们再看RaiseCollectionChangedOnItemAction方法,基本可以确定是Add一下然后在Remove了一下

clip_image028

上述例子我们只是用了dotTrace一个小小的功能,看它的CallTree。DotTrace主要是用来调试性能的,我们可以在CallTree上看到每个方法调用所占时间的百分比。当然我们这里也不能一定确认RowState属性的值是因为这里导致,最少现在我们知道这里可能导致这个问题。下面我们可以在自己的代码中针对这几处调试。调试往往是先定位到几处可能发生问题的地方,然后逐一排除。工具只能帮我们定位到可能发生问题的地方。如果不先缩小我们调试的范围。由于运行的代码过多,往往给调试带来巨大的工作量之后可能还不能找到问题的根源。我们这里主要是简单的介绍DotTrace工具的初步使用方法。

<think>嗯,用户想知道如何在Visual Studio里集成DotTrace调试单元测试。首先,我需要回想一下DotTrace是什么。DotTraceJetBrains的性能分析工具,对吧?它可以帮助分析代码的性能问题,比如找出瓶颈或者内存泄漏。那在Visual Studio中使用的话,可能涉及到安装插件或者配置外部工具。 接下来,用户提到的是调试单元测试,而不仅仅是运行。可能他们遇到了单元测试运行缓慢的问题,或者想分析测试中的性能表现。这时候,使用DotTrace来分析测试的执行情况会比较合适。 首先,我需要确认DotTrace是否支持直接集成到Visual Studio中。根据之前的了解,JetBrains工具有ReSharper,但DotTrace可能更多是作为独立工具使用。不过,可能可以通过外部工具的方式在VS中启动DotTrace来分析单元测试。 然后,步骤可能包括:安装DotTrace,配置Visual Studio的外部工具,设置参数来启动性能分析,然后运行测试。另外,可能还需要用户先构建项目,确保单元测试项目是可执行的。 另外,用户可能需要了解如何设置分析会话的参数,比如选择时间轴分析还是采样模式,以及如何查看结果。此外,如果使用的是ReSharper的单元测试运行器,可能还有更直接的集成方式。 还要考虑不同版本的Visual Studio和DotTrace之间的兼容性,以及是否需要特定的设置。例如,使用命令行工具来附加到进程,或者在VS中配置启动外部程序。 可能还需要提到,如果用户使用的是NUnit、xUnit等测试框架,步骤是否有所不同,但一般来说,DotTrace可以附加到任何运行的进程,所以只要单元测试运行器启动了一个进程,就可以进行分析。 最后,总结步骤应该是:安装DotTrace,在VS中添加外部工具,配置参数,运行测试并分析结果。同时提醒用户注意选择正确的进程和分析模式。</think>### 如何在 Visual Studio 中集成 dotTrace 调试单元测试 #### 步骤 1: 安装 dotTrace 1.JetBrains 官网下载并安装 [dotTrace](https://www.jetbrains.com/dotTrace/),确保安装时勾选 **Visual Studio 集成插件**[^1]。 #### 步骤 2: 配置 Visual Studio 1. 打开 Visual Studio,进入 **扩展 (Extensions)** → **管理扩展 (Manage Extensions)** → **已安装**,确认 **JetBrains dotTrace 插件**已启用。 2. 在顶部菜单栏中选择 **JetBrains** → **Profile Unit Tests**,启用单元测试分析功能[^2]。 #### 步骤 3: 运行单元测试并分析 1. 在测试项目中,右键点击目标单元测试方法或类,选择 **Run Tests with dotTrace**。 2. 在弹出的配置窗口中,选择分析类型: - **时间轴分析(Timeline)**:捕捉方法调用时间、线程活动等。 - **采样(Sampling)**:低开销,适用于初步性能问题定位[^3]。 3. 点击 **Start**,测试运行结束后会自动生成分析报告。 #### 步骤 4: 分析报告解读 - **调用树(Call Tree)**:显示方法调用层级及耗时。 - **热点方法(Hot Spots)**:列出最耗时的单个方法。 - **内存分配(Memory Traffic)**(需选择对应模式):分析内存使用情况[^4]。 ```csharp // 示例:一个可能需优化的单元测试方法 [TestMethod] public void TestDataProcessing() { var processor = new DataProcessor(); var result = processor.ProcessLargeData(); // 此方法可能成为性能瓶颈 Assert.IsNotNull(result); } ``` #### 常见问题排查 - **无法识别测试**:确保测试项目使用标准框架(如 MSTest、NUnit、xUnit)并已正确加载。 - **数据不准确**:关闭其他高资源占用程序,避免干扰分析结果[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值