質問
Visual Studio 内または Mdbg 経由で MSIL を実行しています。
MSIL スタックの内容を表示する方法はありますか?
例えばldloc「何らかの変数」を実行した場合、スタックを調べて変数が現在スタック上にあることを確認する方法はありますか。
MSIL スタックは CPU スタックと同じではない、つまりSPレジスタが指すメモリ?
解決
実行時には、実際には「MSIL」スタックは存在しません。デバッグ モードでも、実行されるコードは常に JIT コンパイルされます。MSIL を JIT コンパイルするプロセスでは、MSIL を仮想スタック マシンから、実行しているプラットフォーム用の通常のアセンブリ コードに「フラット化」します。つまり、 ldloc.0
次のように翻訳される可能性があります mov eax, [sp + 4]
, 、または、値がすでにレジスタ内に存在していた場合は何もしなくても構いません。特定の命令をデバッグしたい場合 ldloc
, 次に、ldoloc が何に変換されたのか、実際にデータがどこからロードされているのかを確認するには、逆アセンブリでそれを確認する必要があります。
WinDbg + SoS ツール (別の投稿で説明) は、次のことを行うのに役立ちます。 マネージコードの観点から CPU スタックを表示する. 。ただし、表示するものが存在しないため、「MSIL」スタックを表示することはできません。
他のヒント
あなたはWinDbgの+ SOSを使用することなどを行うことができます。 href="https://stackoverflow.com/questions/366517/what-is-the-best-resource-for-learning-the-features-and-benefits-of-windbg">この質問 WinDbgの使用方法についての参照用ます。