Pull to refresh

Comments 15

А никто не знает, существует ли под .NET JIT дизассемблер?
Т.е. по аналогии с IL дизассемблером, только отображается не код CIL код, а именно ассемблерный код целевой машины после JIT компиляции.

Если не существует, то кто-нибудь знает, как его посмотреть простым способом?
Ну можно ngen'ом скомпилировать, а потом дизассемблировать. Но это не runtime, конечно
Можно в Visual Studio запустить программу на отладку, поставить breakpoint в метод, ассемблерный код которого хотим посмотреть, и, когда программа остановится на breakpoint'e, нажать правой кнопкой мыши на методе и в меню выбрать «Go To Disassembly».
О, забыл…
Ищу трудных путей (см. коммент ниже) :(
Ну если Visual Studio на машине нет, то можно и при помощи WinDBG + SOS. :)
Это понятно, но там будет другой Ahead Of Time код, не оптимизированный (в частности даже свойства не инлайнятся).
А сделано это для удобства отладки.

Мне нужен именно Just In Time, чтобы посмотреть, как .NET оптимизирует код по максимуму.
Miguel de Icaza в своей последней статье пишет:
Second, even if JIT were the only big issue, a JIT can never be as good as a regular optimizing compiler because a JIT compiler is in the business of being fast, not in the business of generating optimal code. Yes, JITters can target the user’s actual hardware and theoretically take advantage of a specific instruction set and such, but at best that’s a theoretical advantage of NGEN approaches (specifically, installation-time compilation), not JIT, because a JIT has no time to take much advantage of that knowledge, or do much of anything besides translation and code gen.
Так что скорее всего там чудес не будет :)
Я и не говорю про чудеса. Мне просто нужен реальный выполняемый asm код, а не при debug режиме.
Да и потом есть различные мнения на счет .NET в этой статье :)
Можно при помощи WinDBG+SOS.
Например, с дампа процесса или подключив WinDBG как отладчик.
Найти класс (например, !dumpheap -stat), от описателя метода из первой колонки выполняем !dumpmt -md, подбираем нужный (желательно уже JITнутый :) метод, а его адрес даем команде u.

Получится похоже на:
0:000> u 66075284
System_Messaging_ni+0x15284:
66075284 b8408c0666 mov eax,offset System_Messaging_ni+0x8c40 (66068c40)
66075289 90 nop
6607528a e829e9ffff call System_Messaging_ni+0x13bb8 (66073bb8)
6607528f e92ce9ffff jmp System_Messaging_ni+0x13bc0 (66073bc0)
66075294 b8308c0666 mov eax,offset System_Messaging_ni+0x8c30 (66068c30)
66075299 90 nop
6607529a e819e9ffff call System_Messaging_ni+0x13bb8 (66073bb8)
6607529f e91ce9ffff jmp System_Messaging_ni+0x13bc0 (66073bc0)

ngen, наверное, проще. Не пробовал.
UFO just landed and posted this here
UFO just landed and posted this here
Странно, почему такой хороший и полезный .NET Reflector не упомянут?
UFO just landed and posted this here
Потому что стояла задача осветить как можно более неизвестные продукты. Те что все знают… их и так знают, чего о них рассказывать :)
Вот еще хорошая подборка инструментов разработчика. Я бы добавил сюда: AnkhSVN, VSCommands 2010, Productivity Power Tools, JSEnhancements, ReSharper.
Sign up to leave a comment.

Articles