快捷搜索:

试试用JetBrains dotTrace Performance调试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中如图:

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

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

4.dotTrace这样就启动了,默认是开启监控状态,即你现在的操作历程都邑被dotTrace记录下来。假如全部历程被记录下来文件的内容会对照大年夜,不便于我们查找我们必要的器械。点击可以删除本段快照记录,点击可以启动一个新的快照。点击可以获取本段监控的文件并且打开文件。一同事说当在DataFrom(ToolKit控件)中编辑了数据后,当前Entity的一个属性State会转变成其它值,而且调试了半天没跟踪到时哪里改变了这个值。(因为代码封装层数过多运行的地方很多多少又是异步的,并且Entity是动态天生的。大概可能改变值的地方不是我们这边写的代码。以是给调试带来了许多的艰苦。我们项目组有一层代码是其余部门封装的,我们自己也无法调试进去,总之同事确定不是他自己这边的代码改变了这个属性的值)于是我们就将数据操作然后点击空缺处这个历程监控下来。

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

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

阐发:当RowState的值变成Deleted了,必然会设置Entity的RowState,在.NET运行时刻对属性的造访会天生一个set_属性名 这样的一个措施,输入set_RowState。公然找到了set_RowState措施, 双击set_RowState会跳到这个措施的Call Tree

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

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

下面我们反编译QueryablecollectionView的CommitEdit措施

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

上述例子我们只是用了dotTrace一个小小的功能,看它的CallTree。DotTrace主如果用来调试机能的,我们可以在CallTree上看到每个措施调用所占光阴的百分比。当然我们这里也不能必然确认RowState属性的值是由于这里导致,起码现在我们知道这里可能导致这个问题。下面我们可以在自己的代码中针对这几处调试。调试每每是先定位到几处可能发生问题的地方,然后一一扫除。对象只能帮我们定位到可能发生问题的地方。假如不先缩小我私家们调试的范围。因为运行的代码过多,每每给调试带来伟大年夜的事情量之后可能还不能找到问题的根源。我们这里主如果简单的先容DotTrace对象的初步应用措施。

您可能还会对下面的文章感兴趣: