12

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

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

不幸的是!dumpmd,据我所知,它并没有将给定的方法与接口联系起来,因此它不能用于建立实现的接口。

我假设这些信息在内存中的某处可用,但我不确定在哪里查找。任何输入都受到高度赞赏。

4

4 回答 4

1

几年前,我急切地想要一些这样的信息。我最终创建了一个树视图,该树视图仅在您使用晦涩的选项启动应用程序时才会出现。当我单击“刷新”时,它会使用反射来遍历根类实例的所有属性。如果它发现一个属性是一个集合或持有其他属性,它将递归调用它们。最终结果是当时的实例数据树可供阅读。

这种方法的要点是

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

你有没有尝试过

!dumpheap 类型的 IFaces

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

于 2009-08-22T07:51:49.233 回答
0

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

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

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

于 2009-08-22T19:52:51.070 回答
-1

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

于 2009-08-21T01:10:38.570 回答