Почему RuntimeMethodInfo.Invoke не отображается в моем стеке вызовов отладчика Visual Studio? - PullRequest
2 голосов
/ 11 июля 2011

Рассмотрим следующий код 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 и нажимаю точку останова, которую я помещаю в метод «Печать», я получаю следующее вокно callstack:

ConsoleApplication4.exe! ConsoleApplication4.Program.Print (string toPrint)

[От родного к управляемому переходу]

[Управляемый для собственного перехода]

ConsoleApplication4.exe! ConsoleApplication4.Program.Main (string [] args)

Почему RuntimeMethodInfo.Invoke не отображается в моем стеке вызовов?В конце концов, это управляемый метод, так почему я не вижу его так, как ожидал?

Кроме того, каковы здесь правила?Какие управляемые методы могут отсутствовать в моем стеке вызовов?

1 Ответ

1 голос
/ 11 июля 2011

Причина в том, что метод на самом деле не является управляемым методом.RunTimeMethodInfo.Invoke в конечном итоге разрешится до RuntimeMethodHandle._InvokeMethodFast, который помечен как MethodImplOptions.InternalCall.Это означает, что вызов фактически реализован как помощник непосредственно в CLR .

С точки зрения общих правил того, что не будет отображаться в вашем стеке вызовов:

  • Если у вас включен Just My Code (по умолчанию), почти все, что вы не написали, будет отображаться как [External Code] в стеке вызовов.
  • Если вы отлаживаете только управляемую, тогда выВероятно, в конечном итоге вы увидите много переходов Native to Managed и Managed to Native в стеке вызовов.
  • При работе с внутренне реализованными методами вы также увидите некоторую нечеткость в стеке вызовов.
  • Я не уверен в точных правилах для DebuggerHidden, особенно в сочетании с методами «просто мой код», но я бы не ожидал, что они появятся в стеке вызовов.

Если вы хотите увидеть необработанный стек вызовов во всей его красе, вам нужно будет сделать следующее.

  • Отладка с включенной управляемой и встроенной отладкой
  • Отключить Just My Code
...