Вопрос
Я запускаю MSIL внутри Visual Studio или через Mdbg.
Есть ли какой-нибудь способ отобразить содержимое стека MSIL?
например ,если я выполняю ldloc "некоторая переменная", есть ли какой-нибудь способ просмотреть стек и увидеть, что переменная теперь находится в стеке?
Я предполагаю, что стек MSIL - это не то же самое, что стек процессора, т. е.память, на которую указывает регистр SP?
Решение
Во время выполнения на самом деле нет никакого стека "MSIL".Даже в режиме отладки выполняемый код всегда скомпилирован в JIT.Процесс JIT-компиляции MSIL "сглаживает" его из виртуальной стековой машины в обычный ассемблерный код для платформы, на которой вы работаете.Это означает ldloc.0
может в конечном итоге быть переведено во что-то вроде mov eax, [sp + 4]
, или даже без операции, если значение уже лежало где-то в регистре.Если вы хотите отладить конкретную инструкцию ldloc
, затем вы должны посмотреть на это в разборке, чтобы увидеть, во что был переведен ldoloc и откуда он на самом деле загружает данные.
Инструменты WinDbg + SoS (упомянутые в другом посте) помогут вам просмотр стека процессора с точки зрения управляемого кода.Однако они не позволят вам увидеть стек "MSIL", потому что там нет ни одного, который можно было бы увидеть.
Другие советы
Вы можете сделать это и многое другое, используя WinDbg + SoS.Проверить этот вопрос для получения ссылок на то, как использовать WinDbg.