Отладчик кода уровня IL

Есть ли отладчик уровня IL в виде плагина VS или отдельного приложения?

Отладчик Visual Studio великолепен, но он позволяет вам отлаживать либо на уровне кода HLL, либо на языке ассемблера, вы не можете отлаживать IL. Похоже, что в некоторых ситуациях было бы полезно иметь возможность отлаживать на уровне IL.

В частности, это может быть полезно при отладке проблемы в коде, источника которой у вас нет.

Спорный вопрос, действительно ли полезно отлаживать IL, когда у вас нет исходного кода, но в любом случае.

Ответов (5)

Вот статья об отладке IL. В нем говорится, что вы не можете этого сделать, а затем говорится о том, как это сделать. В комментариях также есть информация об этом.

ISTR есть плагин отладчика для Reflector.

Сам не использовал, хотя использовал TestDriven.net для отладки сторонней сборки с помощью Reflector:

weblogs.asp.net/nunitaddin

Лучший способ сделать это - использовать ILDASM для дизассемблирования управляемого двоичного файла, который будет генерировать инструкции IL. Затем перекомпилируйте этот исходный код IL в режиме отладки с помощью ILASM, когда вы запустите отладчик Visual Studio, вы сможете пройти через необработанный IL.

  1. ildasm foo.exe /OUT=foo.exe.il /SOURCE
  2. ilasm foo.exe.il /DEBUG

Я написал сообщение в блоге на эту тему по адресу: Как отлаживать код, созданный компилятором .

Плагин Debug Companion VS кажется именно тем, что я искал, за исключением того, что он не увидит проект библиотеки в моем решении. Только когда я добавил в решение консольное приложение win, что-то появилось в этом списке проектов.

Проблема с подходом декомпиляции / компиляции для меня заключалась в том, что код, который я отлаживал, не был моим кодом. Я все равно мог бы его декомпилировать, но я думаю, что нет способа подписать эту перекомпилированную сборку, чтобы она загружалась вместо исходной.

С конкретной проблемой, которая у меня возникла, оказалось, что достаточно просто отладить ее на уровне языка ассемблера и получить стек вызовов метода, который генерировал исключение, и параметры, с которыми был вызван метод.

Вот файл .BAT, который я использую для отладки ассемблера IL в Visual Studio. Созданный файл .IL.IL содержит исходные строки исходного кода и сгенерированные вами строки ассемблера IL, но не показывает измененный машинный код. Я назвал командный файл ILDEB.BAT, и он вызывается как «ILDEB mypgm». Я использую директиву ассемблера IL «break», чтобы при нажатии отладчик Visual Studio переходил в точку останова.

for /f "tokens=1 delims=." %%1 in ("%1") do set NAME_ONLY=%%1
@erase/q %NAME_ONLY%.il.il
@if not exist %NAME_ONLY%.dll goto quit
ildasm /out:%NAME_ONLY%.il.il /source /nobar %NAME_ONLY%.dll
@if not exist %NAME_ONLY%.il.il goto quit
ilasm /dll /debug /out=%NAME_ONLY%.dll %NAME_ONLY%.il.il
@if not exist %NAME_ONLY%.dll goto quit
peverify %NAME_ONLY%.dll
:quit