VisualStudio内またはMdbg経由でMSILを実行します。
MSILスタックの内容を表示する方法はありますか?
たとえば、ldloc "some variable"を実行した場合、スタックを調べて、変数がスタック上にあることを確認する方法はありますか。
MSILスタックはCPUスタック、つまりSPレジスタが指すメモリと同じではないと思いますか?
実行時には、実際には "MSIL" スタックはありません。デバッグ モードでも、実行されるコードは常に JIT コンパイルされます。MSIL を JIT コンパイルするプロセスは、MSIL を仮想スタック マシンから実行中のプラットフォーム用の通常のアセンブリ コードに "フラット化" します。つまり、値がすでにレジスターに存在していた場合、 のldloc.0
ようなものに変換されたり、ノーオペレーションにさえ変換される可能性があります。mov eax, [sp + 4]
特定の命令をデバッグする場合ldloc
は、逆アセンブルでそれを調べて、ldoloc が何に変換され、実際にどこからデータをロードしているかを確認する必要があります。
WinDbg + SoS ツール (別の投稿で説明) は、マネージ コードの観点から CPU スタックを表示するのに役立ちます。ただし、"MSIL" スタックを表示することはできません。表示するものが存在しないためです。
WinDbg + SoSを使用して、それ以上のことができます。WinDbgの使用方法に関するリファレンスについては、この質問を確認してください。