【问题标题】:Why doesn't RuntimeMethodInfo.Invoke show up on my Visual Studio debugger callstack?为什么 RuntimeMethodInfo.Invoke 没有出现在我的 Visual Studio 调试器调用堆栈上?
【发布时间】:2011-07-10 21:02:15
【问题描述】:

考虑以下 C# 代码:

class Program
{
    static public void Print(string toPrint)
    {
        Console.WriteLine(toPrint);
    }

    static void Main(string[] args)
    {
        Type program = typeof(Program);            
        MethodInfo methodInfo = program.GetMethod("Print", BindingFlags.Static | BindingFlags.Public);
        methodInfo.Invoke(null, new object[] { "a" });
    }
}

当我在 Visual Studio 2008 或 Visual Studio 2008 中运行它并遇到我在“打印”方法中放置的断点时,我在调用堆栈窗口中得到以下信息:

ConsoleApplication4.exe!ConsoleApplication4.Program.Print(字符串 打印)

[本机到托管转换]

[托管到原生转换]

ConsoleApplication4.exe!ConsoleApplication4.Program.Main(string[] 参数)

为什么RuntimeMethodInfo.Invoke 没有出现在我的调用堆栈中?毕竟它是一种托管方法,所以为什么我没有看到它的预期呢?

另外,一般来说,这里的规则是什么?我的调用堆栈中可能会缺少哪些托管方法?

【问题讨论】:

    标签: c# visual-studio debugging visual-studio-debugging


    【解决方案1】:

    原因是该方法实际上不是托管方法。 RunTimeMethodInfo.Invoke 最终将解析为RuntimeMethodHandle._InvokeMethodFast,它被标记为MethodImplOptions.InternalCall。这意味着调用实际上是直接在CLR 中作为助手实现的。

    关于不会出现在调用堆栈中的一般规则:

    • 如果您启用了Just My Code(这是默认设置),那么几乎所有您未编写的内容都会在调用堆栈上显示为[External Code]
    • 如果您只调试托管,那么您最终可能会在调用堆栈上看到很多 Native to ManagedManaged to Native 转换。
    • 在处理内部实现的方法时,您还会在调用堆栈上看到一些模糊性。
    • 我不确定DebuggerHidden 的确切规则,尤其是与“仅我的代码”方法结合使用时,但我不希望它们出现在调用堆栈上。

    如果您想看到原始调用堆栈的全部魅力,那么您需要执行以下操作。

    • 在启用托管调试和本机调试的情况下进行调试
    • 禁用Just My Code

    【讨论】:

    • 抱歉,“解决”到底是什么意思? “Invoke”和“InvokeMethodFast”没有标注MethodImplOptions.InternalCall,只有“_InvokeMethodFast”是:我可以在Reflector中看到他们的代码。
    • @Omer 我的意思是最终将调用_InvokeMethodFastInvoke_InvokeMethodFast 之间的所有内容都是 DebuggerHidden 并且可能因为启用了 Just My Code 而被排除在外。我更新了我的答案以获得更完整的调用堆栈
    • 为了完整性 - 根据this blog post summarizing the effects of the DebuggerXAttributes 和我自己的测试,DebuggerHidden 方法不会出现在调用堆栈上,无论“只是我的代码”如何。
    • @Omer 这就是我的怀疑,但我不确定。不知道我对此有何感受。在追踪错误时,拥有 100% 正确的调用堆栈通常至关重要。
    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多