Как просмотреть разборку оптимизированного кода .NET? - PullRequest
14 голосов
/ 06 августа 2010

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 06 августа 2010

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

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

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

3 голосов
/ 06 августа 2010

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

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

1 голос
/ 23 мая 2017

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

0 голосов
/ 01 марта 2011

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

0 голосов
/ 06 августа 2010

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

...