如何在调试期间查找实现给定接口的所有类型实例

时间:2009-08-20 08:50:57

标签: .net debugging windbg

我正在寻找一种方法来查找实现给定接口的类型堆上的所有当前实例(在WinDbg调试期间)。由于接口不是您可以创建接口实例的类型,因此在检查堆时显然不会显示它们。即!dumpheap在这里没有什么帮助。

但是,给定MT上的!dumpmt -md会列出IFacesIFaceMap的数量。据我所知,这个数字似乎表明该类型是否实现了一个或多个接口。在列表中使用-md标志方法时也会列出。

不幸的是,就我所知,!dumpmd没有将给定方法绑定到接口,因此不能用于建立已实现的接口。

我认为这些信息可以在内存中找到,但我不知道在哪里看。任何输入都非常感谢。

4 个答案:

答案 0 :(得分:1)

几年前,我非常渴望获得这样的信息。我最终创建了一个树视图,只有当您使用一个模糊的选项来启动应用程序时才会出现。当我单击“刷新”时,它将使用反射遍历根类实例的所有属性。如果它发现一个属性是一个集合或拥有其他属性,它将以递归方式调用它们。最终结果是该点的实例数据树可供阅读。

这种方法的要点是

  1. 确保您只有一个 顶级对象实例,或者您 确切知道有多少和哪些顶级实例 有。 (另外,不要忘记静态值。)
  2. 弄清楚如何使用反射来查看相关信息。
  3. 在需要时以可读的方式显示。

答案 1 :(得分:0)

你试过吗

!dumpheap -type IFaces

它也会显示方法表。你可以从那里深入挖掘。

答案 2 :(得分:0)

你最好的选择是从Crack.NET开始,它会做你想做的一些事情(虽然它针对的是wpf和winforms应用程序)。该项目是开源的,因此您应该能够派生出用于从源获取所需信息的方法。它有一个用于Reflector的插件,它允许你检查内存对象的细节。

项目页面: http://joshsmithonwpf.wordpress.com/cracknet/

的CodePlex: http://cracknetproject.codeplex.com/

答案 3 :(得分:-1)

如果您不必创建自己的程序,请尝试NDepend