该工具主要帮助大家诊断Interop Marshalling中间遇到的问题。它的源代码和二进制文件可以在CodePlex上下载:http://clrinterop.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29745

本文首先介绍关于Interop Marshalling的背景,然后通过一个例子来介绍IL Stub Diagnostic工具的使用。

Interop Marshalling: 当我们在托管代码中调用本地代码或者反过来在本地代码中调用托管代码的时候,我们就在做.Net Interop,如下图所示。当我们在托管代码和本地代码之间传递数据的时候,我们就需要Marshalling。长久以来,Marshalling一直是错误的温床。程序员需要通过设置一些列的属性来告诉CLR他们期待的marshalling逻辑,由于看不到CLR生成的具体代码(当然,在调试器里面可以看到汇编代码),所以和Marshalling相关的错误总是难于诊断。我们这次在codeplex上发布的工具就力图解决这个问题。

interop

Intermediate Language(IL) Stub是由CLR动态生成的用于Interop的代码。它主要做两件事情:1. 在本地代码和托管代码之间Marshal数据;2. 调用目标函数。张羿撰写的CLR 4.0 Beta1新功能:Stub Method Redirection一文中,也对IL Stub做了相关的介绍。

综合以上两点,大家多半可以猜到IL Stub Diagnostics的工作方式:该工具可以实时监测CLR生成的IL Stub,并且把stub的IL代码展示给用户。根据这些信息来诊断Marshalling过程中的错误。

 

下载文件介绍

本次发行包括了两个下载文件,一个是源代码,留给有兴趣的朋友们自己研究。这里主要介绍二进制文件。解压缩之后有两个文件夹和一个文档。ILStubDiagnostic包含了本工具的可执行文件,Sample中是一个pinvoke的例子,用以展示IL Stub Diagnostic工具的功能。Tutorial是一个简单的教程,由于面向全球用户,用英语撰写,在这里会给出中文对应。

运行环境介绍

由于使用了CLR v4以及ETW的新功能,所以被监测的托管程序必须在安装了v4 CLR的vista(或者win2008、win7)上运行。

 

例子

1) 启动IL Stub Diagnostic之后,看到如下界面:

pic1

2) 单击Start按钮之后,看到界面的右上角有一个环形动画,表示IL Stub Diagnostic正在监测中。

3) 运行sample文件夹下的pinvoke.exe,我们会在IL Stub列表区中得到一些IL Stub项。需要注意的是,由于pinvoke.exe调用的本地代码是32位,所以它需要运行的32位CLR上。关于32位/64位CLR的背景,可以参见我的博文:在64位windows中运行托管程序。

pic2

4)在IL列表区右击任何一列的标题,可以选择显示不同的IL Stub信息

pic3

5) 在IL列表区单击任何一个感兴趣的stub,在代码区可以看到具体内容。

6) 在工具栏里单击IL Code,可以把代码区最大化。

pic4

7) 初次见到IL代码的朋友可能会有些茫然,在工具下方有一组导航按钮帮你找着北。单击“Next Block”和“Previous Block”可以在看到不同的代码块,相关的注释暗示了代码的用途。

8) 在IL Stub代码中,我们用到了StubHelpers的API,并且用下划线标明,把鼠标移到他们上面可以看到相关的解释。

pic5

9) 有的时候,一个程序会使用多个IL Stub,界面中的过滤器区域可以帮助大家更迅速的定位自己感兴趣的Stub:

a. 如下图所示,设置过滤器

pic6

b. 点击工具栏上的Refresh按钮,IL Stub列表区会根据设置的过滤器更新IL Stub项。同时,过滤器列表中的文字也会被更新。

pic7

c. 如果要删除过滤器,可以右击行首,选择“Delete Filter”,并点击工具栏上的Refresh按钮。

pic8 

 

今天的介绍就到这里,欢迎大家给我们提供关于这个工具的使用反馈,我们会继续维护并且改进这个工具。