我们可以从.Net中的调试器对debugee进行反思

时间:2015-07-29 07:17:43

标签: .net reflection jit il system.reflection

我想使用ICorDebug API从调试器获取debugee函数的本机(x86)代码。在获得ICorDebugFunction之后,我可以在其上调用GetNativeCode,但只有在它被Jited时才返回本机代码。所以我需要强有力地抓住它。 RuntimeHelpers.PrepareMethod可以做到这一点,但它需要一个方法句柄(不是方法标记)。从调试器我有方法标记但不是方法句柄。那么我们可以从调试器获得真实的MethodInfo对象(可以让我得到句柄)的debugee函数吗?换句话说,是否可以从调试器对debugee进行反思?

1 个答案:

答案 0 :(得分:3)

不完全是。

您可以使用IMetadataImport et. al.获取静态信息,并且可以通过ICorDebug api直接获取某些动态信息,但是需要在调试对象上运行任何其他类型的反射(通常使用ICorDebugeEval。

如果您不介意使用ICorDebugEval在调试对象上执行反射,则可以使用以下序列。

  1. ICorDebugAppDomain::GetObject获取表示调试对象中AppDomain对象的ICorDebugValue。
  2. AppDomain.GetAssemblies()Assembly.Module找到Module对象。
  3. 将元数据标记传递到Module.ResolveMember(int)以获取MethodBase。
  4. 使用MethodBase.MethodHandle获取运行时句柄。
  5. 根据您的使用情况,将最后3个步骤与对PrepareMethod的调用组合成一个辅助方法可能是有益的,该方法位于您具有调试负载的单独程序集中。