Visual studio как посмотреть il код

Обновлено: 06.07.2024

Как в Visual Studio for Web 2013 посмотреть не пользовательский код (то есть код из подключенных пространств имен)? Хочу установить там брекпойнт. Нашел в Object Browser лишь перечисление классов, но не сам код.

Брекпойнт можно поставить и без просмотра кода - не обязательно открывать код и нажимать на конкретной строчке F9. Можно поставить брекпойнт по имени функции.

Достаточно включить отладку чужого кода: снять чекбокс Debug/Options/Enable Just My Code.

Потом просто поставить брекпойнт:

  • открыть Debug/New Breakpoint/Break at Function
  • ввести имя класса и метода. Или просто имя метода Например брекпойт на "Update" поставит брекпойнты на все методы Update во всех классах во всех подключенных сборках.
  • если будет показано окно с предупреждением - прочитать и проигнорировать
  • проверить результат в окне Breakpoints

Если повезет, и если для стороннего кода есть проиндексированные отладочные символы - вам покажет исходный код. Если не повезет - то покажет только call stack, locals и переданные параметры - т.е. все кроме самих исходников.

Если вам нужна именна пошаговая отладка исходников:

Для другого кода, исходников которого у вас нет - можно воспользоваться бесплатным dotPeek или платными Resharper / Reflector - они умеют декомпилировать и генерировать индексированные отладочные символы для сторонних сборок.

47k 11 11 золотых знаков 74 74 серебряных знака 143 143 бронзовых знака

Вы не можете поставить точку останова в коде, для которого у вас нету исходников и/или pdb-файлов (так называемые «символы»).

Если вы хотите отладить код сторонней библиотеки, это скорее всего не получится можно воспользоваться встроенной в Visual Studio 2019 поддержку декомпиляции. Она работает, начиная с версии 16.5. Для некоторых более ранних версий Студии поддержка можно тоже включить, но результат не гарантирован. «Под капотом» у этой декомпиляции находится проект ILSpy, которым можно пользоваться и отдельно.

В окне Дизассемблированный код отображается код сборки, соответствующий инструкциям, созданным компилятором. При отладке управляемого кода эти инструкции ассемблера соответствуют присущему данному объекту коду, созданному компилятором JIT, а не промежуточному языку (MSIL), созданному компилятором Visual Studio.

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

Эта возможность доступна, только если включена отладка на уровне адреса. Она недоступна для отладки скриптов и SQL.

В дополнение к инструкциям ассемблера в окне Дизассемблированный код могут отображаться следующие сведения:

Исходный код, из которого получается код сборки.

Байты кода, то есть байтовое представление реальных инструкций компьютера или языка MSIL.

Символьные имена для адресов памяти.

Номера строк, соответствующие исходному коду.

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

Код на ассемблере активно использует регистры процессора, а при использовании управляемого кода — регистры среды выполнения. Вы можете использовать окно Дизассемблированный код в сочетании с окном Регистры, которое позволяет изучить содержимое регистров.

Чтобы просмотреть инструкции машинного кода в необработанной числовой форме, а не на языке ассемблера, используйте окно Память или выберите Байты кода в контекстном меню в окне Дизассемблированный код.

Использование окна дизассемблирования

Чтобы включить окно Дизассемблированный код, выберите в разделе Сервис > Параметры > Отладка параметр Включить отладку на уровне адреса.

Чтобы открыть окно Дизассемблированный код во время отладки, выберите Windows > Дизассемблированный код или нажмите сочетание клавиш ALT+8.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Сброс параметров.

Чтобы включить или отключить вывод дополнительных сведений, щелкните правой кнопкой в окне Дизассемблированный код и установите или снимите в контекстном меню соответствующие флажки.

Желтая стрелка, расположенная в левом поле, отмечает текущую точку выполнения. Для собственного кода точка выполнения соответствует счетчику команд ЦП. В этом расположении отображается следующая инструкция, которая будет выполнена в программе.

Подскажите пожалуйста где в Visual Studio находится окно дизасемблерного кода?
Также интересно как запустить дизасемблер, который находится по умолчанию в Visual Studio 2012?
Мне нужен путь и конкретный файл который надо запустить.


Где в Visual Studio находится компилятор?
И как он называется? Компилятор же? Не ассемблер, правильно говорить?

Окно карты кода в Visual Studio
Прикрепил скрин снизу. Как называется окно которое обведено краным? Где его включить? Увидел в.

infobos, Debug > Windows > Dissasembly (Ctrl + Alt + D). Вызывается только в режиме отладки. Если нужно посмотреть именно на байт-код, то это делает утилитой ILDasm, вызываемой из командной строки разработчика (developer command prompt) в меню "Пуск".

Ищу файл: Ildasm.exe (IL Disassembler)
Где он в пути находится?

Добавлено через 4 минуты

Если нужно посмотреть именно на байт-код, то это делает утилитой ILDasm, вызываемой из командной строки разработчика (developer command prompt) в меню "Пуск".

Добавлено через 1 минуту

вызываемой из командной строки разработчика (developer command prompt) в меню "Пуск"

Как это делается?

Добавлено через 3 минуты
Он в видео показал: Открывается окно и дерево методов и классов. И выбираешь клас или метод и прямо ковыряешь ассемблерный код прямо в том пути, который выбираешь.

Добавлено через 3 минуты
Или дайте ссылку где его качать.

Решение

infobos, ILDasm входит в состав Windows SDK который ставится вместе с VS. Ищи его в папке Program Files\Microsoft SDKs\Windows\vX.Y\bin. В папке bin может быть две версии ILDasm. В корне для CLR v2, в подпапке NETFX 4.0 Tools для CLR v4.

Вот путь: C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe

Скрылось окно ввода кода в Visual Studio
Помогите комп неожиданно вырубился когда редактировал код, после этого в visual studio скрылось.

Где находится файл csc.exe у Microsoft Visual Studio 2008?
Задаю не новый вопрос, но всё же. Где находится файл csc.exe у Microsoft Visual Studio 2008.


Где в Visual Studio можно настроить шрифт кода?
Где в Visual Studio можно настроить шрифт кода? Изменить размер и убрать это сглаживание от.

Важнейшие свойства CIL могут быть сформулированы следующим образом:

  • объектная ориентация и применение интерфейсов
  • строгое различие между типами значений и типами ссылок
  • строгая типизация данных
  • обработка ошибок через использование исключений
  • применение атрибутов

Давайте рассмотрим первые два свойства более подробно:

Поддержка объектной ориентации и интерфейсов

Так же, язык CIL имеет способность языкового взаимодействия, под которой подразумевается возможность для классов, написанных на одном языке, напрямую обращаться к классам, написанным на другом языке, т.е.:

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

класс может содержать экземпляр другого класса, независимо от того, на каких языках написан каждый из них

объект может напрямую вызывать методы другого объекта, написанного на другом языке

объекты (или ссылки на объекты) могут передаваться между методами

при вызове методов между языками можно шагать в отладчике по вызовам, даже если это означает необходимость перемещения между фрагментами исходного кода, написанными на разных языках

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

В терминах С++ ссылочные типы можно рассматривать, как будто они обращаются к переменным через указатель, в то время как для Visual Basic лучшая аналогия для ссылочных типов — это объекты, обращение к которым в Visual Basic 6 всегда осуществляется по ссылке. В языке IL также установлена своя спецификация относительно хранения данных: экземпляры ссылочных типов всегда хранятся в области памяти, известной как managed heap, в то время как типы значений обычно хранятся в стеке (хотя, если типы значений объявлены как поля внутри ссылочных типов, то они также будут сохранены в managed heap).

Утилита ildasm.exe

Утилиту ildasm.exe также легко запустить, открыв в Visual Studio 2010 окно Command Prompt (Командная строка), введя в нем слово ildasm и нажав клавишу Enter:

Вызов утилиты ildasm.exe

Давайте сначала составим простейшую сборку:

Скомпилируем и откроем .exe файл через утилиту ildasm.exe:

Утилита ildasm.exe

Помимо содержащихся в сборке пространств имен, типов и членов, утилита ildasm.ехе также позволяет просматривать и CIL-инструкции, которые лежат в основе каждого конкретного члена. Например, в результате двойного щелчка на методе Main в классе Program открывается отдельное окно с CIL-кодом, лежащим в основе этого метода.

CIL-код сборки

Для просмотра метаданных типов, которые содержатся в загруженной в текущий момент сборке, необходимо нажать комбинацию клавиш <Ctrl+M>.

Метаданные типов

И, наконец, чтобы просмотреть содержимое манифеста сборки, необходимо дважды щелкнуть на значке MANIFEST.

Данные манифеста

Несомненно, утилита ildasm.ехе обладает большим, чем было показано здесь количеством функциональных возможностей; все остальные функциональные возможности этой утилиты будут демонстрироваться позже в данном руководстве при рассмотрении соответствующих аспектов.

Объяснение на общем уровне

image 2 Основы .NET – структура .NET сборки

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

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

Что то вроде этого:

Управляемый модуль

Любой управляемый модуль, независимо от того из какого кода он был создан, состоит из следующих четырех больших частей:

  1. Хедера PE32
  2. CLR хедера
  3. Метаданных
  4. IL кода

PE хедер

Чтобы получить некоторую информацию про PE хедер, в командной строке Visual studio нужно выполнить следующую комманду:

dumpbin /all assembly_name > result.txt

Эта команда создаст файл result.txt, который будет содержать следующую информацию о PE хедере (среди множества другой информации:

image thumb 10 Основы .NET – структура .NET сборки

На этой картинке мы видим что PE хедер содержит информацию про:

image thumb 11 Основы .NET – структура .NET сборки

CLR хедер

Если мы промотаем файл result.txt до секции хедера CLR, мы увидим следующее:

image thumb 13 Основы .NET – структура .NET сборки

Отсюда мы видим:

Метаданные

Пока у нас еще открыт dumbin result.txt файл, давайте взглянем на что то очень крутое, а именно на то как распознать где в модуле начинается сегмент метаданных.

Если промотаем к первой строке данных, то увидим что то вроде этого:

image thumb 15 Основы .NET – структура .NET сборки

После этого можно закрывать результирующий файл dumbin, потому что для исследования метаданных и IL кола мы будем использовать утилиту ILDasm.exe и ее результаты.

Чтобы использовать утилиту нужно опять открыть командную строку Visual Studio, перейти в папку где находится результирирующая сборка и выполнить следуюущую команду:

ildasm CSharp_ILCode.exe

Как только это будет выполнено, мы увидим окно приложения ILDasm, которое покажет первую часть встроенного файла манифеста.

image thumb 16 Основы .NET – структура .NET сборки

Чтобы увидеть что содержит манифест я дважды кликнул по нему. Результирующее окно содержит определение данных уровня сборки и определяет данные необходимые для связи с внешними сборками.

В нашем примере определение mscoree.dll будет выглядеть следующим образом:

image thumb 17 Основы .NET – структура .NET сборки

Ранее в части CLR хедера мы видели что там есть информация про токен метаданных точки входа сборки, который имел значение 6000001.

image thumb 20 Основы .NET – структура .NET сборки

  • в CLR хедере мы определили значение токена
  • потом значение токена используется в метаданных для для поиска подходящего элемента MethodDef
  • этот элемент описывает часть IL кода которая будет выполена как точка входа.

Данные бинарного блока метаданных состят из нескольких таблиц которые могут быть категоризированы в таблицы определения, таблицы связей и таблицы манифестов, но рамки этого поста не позволяют его подробное объяснение (в случае если вы заинтересованы в более глубоких деталях касающихся метаданных проверьте главную страницу метаданных MSDN).

IL Код

После этого я раскрыл дерево ILDasm и дважды кликнул элемент метода Main.

image thumb 22 Основы .NET – структура .NET сборки

Как мы видим, статический метод Main обозначен как .entrypoint.

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

Вот почему мы имеем:

  • L_0005 System.Console:WriteLine(string) (System namespace, console type, write line member)
  • L_000a CSharp_ILCode.Program:Hello2() (CSharp_ILCode namespace, Program type, Hello2 member)

Один вопрос неизбежен:

Ответ очень прост и уже показан в части описывающей содержимое манифеста, где мы видели в начале данных манифеста определение публичного токена mscorlib которое будет использовано для доступа к этой сборке в GAC.

Пока мы все еще в окне IL кода, давайте ответим на еще один вопрос:

image thumb 2 Основы .NET – структура .NET сборки

Как мы видим, компилятор вставил перед каждой линией одно NOP выражение. Когда мы ставим точку прерывания (break point) на линии в среде разработки Visual Studio, точка прерывания по факту ставиться на NOP функции перед этой линией. Так как в Release режиме нет NOP инструкций созданных компилятором нет никакой возможности поставить точку перерывания.

Читайте также: