Подтвердить что ты не робот

Как я могу просмотреть разборку оптимизированного jitted-кода .NET?

По той или иной причине мне иногда кажется полезным или просто интересно посмотреть на оптимизированный вывод компилятора для функции.

Для неуправляемого кода на C/С++ мой любимый способ сделать это состоял в том, чтобы скомпилировать в режиме Release, придерживаться точки останова в интересующей вас функции, запускать и просматривать разборку в Visual Studio, когда она попадает в точку останова.

Недавно я попробовал это с проектом С# и обнаружил, что эта техника не работает. Даже в режиме Release разборки, которые я вижу, явно не оптимизированы. Я обнаружил и отключил (в Visual Studio 2010) параметр "Отладка... Параметры и настройки... Отладка... Общая... Запретить оптимизацию JIT на загрузке модуля", которая, предположительно, приближает меня к тому, что я хочу, только теперь он предупреждает меня, когда я пытаюсь запустить его, и тогда я не могу заставить его остановиться на точке останова, чтобы я мог видеть разборку.

Итак, если я хочу увидеть дизассемблированный, оптимизированный вывод дрожания CLR (4.0) для функции, какой лучший способ это сделать? Чтобы быть ясным, я хотел бы увидеть разборки x86 (или предпочтительно x86_64), а не только разборки IL (что вы можете увидеть в Reflector).

4b9b3361

Ответ 1

Конечно, после полудня поиска ответа на этот вопрос я нахожу ответ сам через 5 минут после того, как я спрошу о SO.

Я был близок; единственный недостающий шаг от того, что у меня было в вопросе, заключалось в том, что "Включить только мой код" также необходимо отключить в настройках.

Полное руководство доступно здесь: http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx

Ответ 2

Я считаю, что JIT знает, когда вы работаете под отладчиком, и генерирует более "дружественный к отладчику" x86-код, который объясняет, почему код x86, который вы видели, был неоптимизирован.

Возможно, вы попытаетесь запустить автономное приложение, выполнив код, который вас интересует хотя бы один раз (так что он отключается без отладчика), затем присоедините отладчик к процессу и установите точку останова.

Ответ 3

Точки останова в оптимизированном коде не работают в встроенных функциях. Если вы хотите просмотреть разбор встроенной функции, вы можете вставить команду System.Diagnostics.Debugger.Break(); в исходный код.

Ответ 4

Вы можете попробовать проверить сборку NGEN'd, но это будет довольно сложно, поскольку метаданные не присутствуют. Но он мог бы работать:)

Ответ 5

Запуск под VisualStudio независимо от того, находитесь ли вы в режиме отладки или выпуска, все равно будет выполняться под отладчиком. Поскольку он работает под отладчиком, он не может работать с оптимизированным кодом.