我们可以从 .Net 中的调试器对被调试者进行反射吗

Can we do reflection on debugee from debugger in .Net

我想使用 ICorDebug API 从调试器中获取被调试函数的本机 (x86) 代码。获得 ICorDebugFunction 后,我可以对其调用 GetNativeCode,但它 returns 仅当它已被 Jited 时才是本机代码。所以我需要强行JIt它。 RuntimeHelpers.PrepareMethod 可以做到这一点,但它需要一个方法句柄(不是方法令牌)。从调试器中我有方法令牌但没有方法句柄。那么我们是否可以从调试器中获取被调试函数的真实 MethodInfo 对象(可以获取句柄)?换句话说,是否可以从调试器对被调试者进行反射?

不完全是。

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

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

  1. ICorDebugAppDomain::GetObject 获取表示被调试对象中的 AppDomain 对象的 ICorDebugValue。
  2. AppDomain.GetAssemblies() and Assembly.Module 查找模块对象。
  3. 将元数据标记传递到 Module.ResolveMember(int) 以获取 MethodBase。
  4. 使用 MethodBase.MethodHandle 获取您的 运行 时间句柄。

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