2011-07-10 13 views
2

は、次のC#コードを考えてみましょう:Visual Studioデバッガの呼び出しスタックにRuntimeMethodInfo.Invokeが表示されないのはなぜですか?

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  メーカー  2008またはVisual   Studioの  2008年にそれを実行して、私は「印刷」メソッド内に置くブレークポイントにヒットすると、私は次の取得しますコールスタックウィンドウ:!

ConsoleApplication4.exe ConsoleApplication4.Program.Print(文字列 toPrint)マネージド・トランへ

[ネイティブネイティブの移行への管理対象sition]

[]

ConsoleApplication4.exe!ConsoleApplication4.Program.Main(文字列[] argsが )

RuntimeMethodInfo.Invokeが私のコールスタックに表示されないのはなぜ?結局のところ管理された方法なので、私はそれが私が期待するように見ないのはなぜですか?

また、一般的に、ここでのルールは何ですか?コールストアから欠落していると思われる管理対象メソッドはどれですか?

答えて

1

この理由は、実際には管理されたメソッドではないためです。 RunTimeMethodInfo.Invokeは、最終的にに解決され、MethodImplOptions.InternalCallとしてマークされます。つまり、この呼び出しは実際にはCLRのヘルパーとして実装されています。あなたのコールスタックに表示されません何のための一般的な規則の面では

  • あなたが書いていないほとんど何がとして表示されます(デフォルト)Just My Code有効にしている場合呼び出しスタックの[External Code]
  • あなたが管理しているデバッグだけの場合は、おそらく多くの呼び出しスタック上でNative to ManagedManaged to Nativeの遷移が見られるでしょう。
  • 内部的に実装されたメソッドを扱う場合、コールスタックにも少しの曖昧さがあります。
  • DebuggerHiddenの正確なルールはわかりません。特に「ちょうど私のコード」メソッドと組み合わせた場合は特にそうですが、コールスタックにそれらが表示されるとは思われません。

未処理のコールスタックをすべて表示するには、次の操作を行う必要があります。

  • デバッグの両方を管理し、ネイティブのデバッグが有効になって
  • 無効にJust My Code
+0

申し訳ありませんが、あなたは正確に「まで解決」によって何を意味するのですか? "Invoke"と "InvokeMethodFast"はMethodImplOptions.InternalCallとマークされておらず、 "_InvokeMethodFast"のみです:Reflectorでコードを見ることができます。 –

+0

@Omerというのは、最終的に '_InvokeMethodFast'がコールされることを意味します。 'Invoke'と' _InvokeMethodFast'の間の全てが 'DebuggerHidden'であり、' Just My Code'が有効になっているため、おそらく除外されます。私は、より完全なコールスタックを得るための答えを更新しました – JaredPar

+0

- [DebuggerXAttributesの影響をまとめたこのブログ記事](http://blogs.msdn.com/b/stevejs/archive/2005/12)によると、 /03/499803.aspx)と私自身のテストでは、 "Just My Code"にかかわらず、 'DebuggerHidden'メソッドは呼び出しスタックに表示されません。 –

関連する問題