我们可以在.net中的调试器中对被调试者进行反射吗?



我想从使用ICorDebug api的调试器中获得debugee函数的本机(x86)代码。在获得ICorDebugFunction之后,我可以在它上调用getativcode,但它只有在被jit时才返回本机代码。所以我需要强制JIt它。RuntimeHelpers。PrepareMethod可以做到这一点,但它需要一个methodhandle(而不是一个方法令牌)。从调试器,我有方法令牌,但没有方法句柄。那么,我们可以从调试器中获得一个debugee函数的真正的MethodInfo对象(它可以让我得到句柄)吗?换句话说,是否有可能从调试器对被调试者进行反射?

不完全是。

你可以使用IMetadataImport等来获取静态信息,一些动态信息可以直接通过ICorDebug api获得,但是任何其他类型的反射都需要在被调试对象上运行(通常使用ICorDebugeEval)。

如果你不介意使用ICorDebugEval在被调试对象上执行你的反射,你可以使用下面的顺序。

  1. ICorDebugAppDomain::GetObject获取一个ICorDebugValue,表示在debuggee中的AppDomain对象。
  2. AppDomain.GetAssemblies()和Assembly。模块来查找Module对象。
  3. 将元数据令牌传入Module.ResolveMember(int)以获取MethodBase。
  4. MethodBase使用。获取运行时句柄

根据您的用例,将最后3个步骤与您对PrepareMethod的调用合并到您已加载调试的单独程序集中的helper方法中可能是有益的。

相关内容

  • 没有找到相关文章

最新更新