2

次の 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 で実行し、"Print" メソッド内に配置したブレークポイントにヒットすると、コールスタック ウィンドウに次のように表示されます。

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

[管理された移行にネイティブ]

【マネージドからネイティブへの移行】

ConsoleApplication4.exe!ConsoleApplication4.Program.Main(文字列[]引数)

RuntimeMethodInfo.Invokeコールスタックに表示されないのはなぜですか? 結局のところ、これは管理されたメソッドなので、期待どおりに表示されないのはなぜですか?

また、一般的に、ここでのルールは何ですか? コールスタックから欠落していると予想されるマネージ メソッドはどれですか?

4

1 に答える 1

1

その理由は、メソッドが実際にはマネージ メソッドではないためです。としてマークされているものRunTimeMethodInfo.Invokeまで最終的に解決されます。これは、呼び出しが実際にはヘルパーとして直接CLRに実装されていることを意味します。RuntimeMethodHandle._InvokeMethodFastMethodImplOptions.InternalCall

コール スタックに表示されないものの一般的なルールについては、次のとおりです。

  • 有効にJust My Codeすると (これがデフォルトです)、記述していないほとんどすべてが[External Code]コール スタックに表示されます。
  • マネージのみをデバッグしている場合は、コール スタックで多くの遷移が発生する可能性Native to ManagedがありManaged to Nativeます。
  • 内部的に実装されたメソッドを扱う場合、コール スタックにも多少のあいまいさが見られます。
  • DebuggerHidden特に「自分のコードだけ」のメソッドと組み合わせた場合の正確なルールについてはわかりませんが、それらがコールスタックに表示されることを期待する必要はありません。

生のコール スタックをすべて見たい場合は、次の手順を実行する必要があります。

  • マネージド デバッグとネイティブ デバッグの両方を有効にしてデバッグする
  • 無効にするJust My Code
于 2011-07-10T21:13:25.167 に答える