【问题标题】:Can we do reflection on debugee from debugger in .Net我们可以从 .Net 中的调试器对被调试者进行反思吗
【发布时间】:2015-10-20 00:52:04
【问题描述】:

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

【问题讨论】:

    标签: .net reflection jit il system.reflection


    【解决方案1】:

    不完全是。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多