【问题标题】:How to find all instances of types that implement a given interface during debugging如何在调试期间找到实现给定接口的所有类型实例
【发布时间】:2009-08-20 08:50:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么投反对票?请解释一下,以便我有机会改进我的问题。谢谢。
  • 你解决过这个问题吗?我正在寻找相同但没有调试器的实时进程。

标签: .net debugging windbg


【解决方案1】:

你试过了吗

!dumpheap 类型的 IFaces

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

【讨论】:

  • 不,它列出了 IFaces 是其名称一部分的类型的实例。 type 参数对类型名称使用常规文本匹配,因此与接口无关。
【解决方案2】:

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

这种方法的要点是

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

【讨论】:

  • 嗯,信息在源代码中。我只想了解如何在调试期间挖掘信息。由于运行时必须在某处拥有此信息,因此“只是”挖掘细节的问题。不过还是感谢您的意见。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我看不出 NDepend 在这里有什么用处。我有所有可用的源代码,所以如果需要我可以找到实现者。我有兴趣在运行时在内存中查找实例。
    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2011-03-08
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多