Поделиться через


Общие сведения об отладке среды CLR

API отладки среды CLR позволяют поставщикам средств писать отладчики для отладки приложений, выполняемых в среде CLR. Отлаживаемым кодом может быть любой тип кода, поддерживаемый средой CLR.

Интерфейс API для отладки в среде CLR реализуется преимущественно с помощью неуправляемого кода. Поэтому API отладки представляется в виде набора COM-интерфейсов. API состоит из следующих компонентов:

  • коллекции COM-объектов и интерфейсов, реализуемых средой CLR;

  • коллекции интерфейсов обратных вызовов модели COM, которые должны быть реализованы отладчиком.

Обзор включает следующие разделы.

  • Сценарии отладки среды CLR

  • Категории API

  • Вложение или запуск программы

  • Управление выполнением

  • Проверка состояния программы

  • Изменение состояния программы

  • Использование операции "Изменить и продолжить"

  • Функции вычисления

  • Динамическая вставка кода

  • Поддерживаемые среды

  • Связанные разделы

Сценарии отладки среды CLR

В следующих разделах описан процесс обработки типичных сценариев отладки интерфейсом API отладки среды CLR. Обратите внимание, что среда CLR поддерживает некоторые сценарии непосредственно, а для поддержки других сценариев взаимодействует с текущими методами.

Внепроцессная отладка

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

API отладки среды CLR поддерживает внепроцессную отладку непосредственно. API обрабатывает все процессы обмена данными между отладчиком и управляемой частью отлаживаемого объекта для обеспечения поддержки отладки управляемого кода.

Хотя API отладки среды CLR используется вне процесса, некоторые элементы логики отладки (например, синхронизация потока) располагаются в одном процессе с отлаживаемым объектом. В большинстве случаев — это данные реализации, которые должны быть прозрачными для отладчика. Дополнительные сведения о синхронизации потоков см. в разделе Архитектура отладки среды CLR. Недостатком в данном случае является то, что API отладки нельзя использовать для проверки аварийных дампов, если они применяются вне процесса.

Внутрипроцессная отладка

В платформе .NET Framework версии 1.0 и 1.1 API отладки среды CLR поддерживал ограниченную внутрипроцессную отладку, в которой профилировщик мог использовать функции проверки API отладки. В .NET Framework 2.0 внутрипроцессная отладка была заменена набором функциональных возможностей, которые лучше соответствуют API профилирования. Дополнительные сведения об этих изменениях см. в описании функций моментальный снимок стека и проверка объекта в разделе Общие сведения о профилировании.

Отладка в удаленном процессе

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

  • Ограниченные ресурсы.

  • Зависимости расположений.

  • Ошибки, создающие помехи для операционной системы.

API отладки среды CLR не поддерживает отладку в удаленном процессе непосредственно. Отладчик, в основе которого лежит API отладки среды CLR, должен по-прежнему существовать вне процесса отлаживаемого объекта. Поэтому для такого решения на компьютере с отлаживаемым объектом нужно использовать прокси-процесс.

Отладка неуправляемого кода

Управляемый и неуправляемый код могут сосуществовать в одном процессе. Требуется одновременная отладка обоих типов кода.

API отладки среды CLR поддерживает переход через границу между управляемым и неуправляемым кодом, но не поддерживает непосредственную отладку неуправляемого кода. Однако он может сосуществовать с отладчиком неуправляемого кода, совместно используя средства отладки платформы Win32.

Помимо этого, API отладки среды CLR предоставляет две возможности для отладки процесса.

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

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

Смешанные языковые среды

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

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

Многопроцессные и распределенные программы

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

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

К началу

Категории API

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

  • Интерфейсы, поддерживающие отладку приложений среды CLR.

  • Интерфейсы, предоставляющие доступ к символической отладочной информации, которая обычно хранится в файлах базы данных программы (PDB).

  • Интерфейсы, поддерживающие запрос процессов и доменов приложения на компьютере.

В основе API отладки лежат два дополнительных набора интерфейсов.

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

  • API хранения символов, поддерживающий отладку на уровне источника для отладчиков управляемого кода.

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

Категория API

Описание

Регистрация

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

Уведомление

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

Точка останова

Интерфейсы, вызываемые отладчиком для извлечения сведений о точках останова.

Выполнение

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

Сведения

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

Перечисление

Интерфейсы, вызываемые отладчиком для перечисления объектов.

Изменение

Интерфейсы, вызываемые отладчиком для изменения отлаживаемого кода.

В следующих разделах описаны функциональные возможности служб отладки среды CLR.

К началу

Вложение или запуск программы

Среда CLR предоставляет возможность вложения отладчика в выполняемую программу или запуска процесса. Службы отладки среды CLR поддерживают JIT-отладку, позволяя вкладывать отладчик в программу, создающую необработанное исключение. Однако, программа, не выполняемая в отладочном режиме, может иметь меньший объем отладочной информации. Во избежание возникновения этой проблемы программа всегда может запускать себя в отладочном режиме. Дополнительные сведения об отладочном режиме см. в следующих разделах:

К началу

Управление выполнением

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

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

Точки останова

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

Отладка по шагам

Службы отладки среды CLR предоставляют широкий набор пошаговых функций. Программа может проходить по коду по одной инструкции за раз (пошаговый режим) или по диапазону инструкций за раз (диапазонный режим). Функция может быть пропущена, может быть выполнен вход или выход из нее. Службы отладки среды CLR также могут оповещать отладчик об исключении, прерывающем пошаговое выполнение.

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

Среда CLR не предоставляет непосредственные функции пошагового выполнения на уровне источника. Отладчик может предоставлять эти функции путем использования диапазонного режима с собственной информацией сопоставления источников. Интерфейсы хранилища символов могут использоваться для получения информации на уровне источника. Дополнительные сведения об этих интерфейсах см. в разделе Хранилище диагностических символов (ссылка неуправляемого API).

Исключения

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

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

События программ

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

Управление потоком

Услуги отладки среды CLR предоставляют интерфейсы среды CLR для приостановки и возобновления индивидуальных (управляемых) потоков.

К началу

Проверка состояния программы

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

Также может проверяться стек вызовов потока. Стек вызовов потока подразделяется на два уровня: уровень цепочки и уровень кадра стека. Стек вызовов сначала подразделяется на цепочки. Цепочка представляет собой непрерывный логический сегмент стека вызовов. Она содержит только управляемые или неуправляемые кадры стека, но не оба типа одновременно. Кроме того, все управляемые фреймы вызова в одной цепочке используют один контекст среды CLR. Цепочка может быть управляемой или неуправляемой.

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

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

ПримечаниеПримечание

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

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

К началу

Изменение состояния программы

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

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

  • Целевой указатель инструкции не расположен на фильтре исключений, блоке catch или блоке finally.

  • Текущий указатель инструкции расположен внутри блока catch, а целевой указатель инструкции не расположен снаружи блока catch.

  • Целевой указатель инструкции находится в том же фрейме, что и текущий указатель инструкции.

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

После изменения указателя инструкции службы отладки среды CLR помечают любую кэшированную информацию стека как недопустимую и обновляют информацию для использования в следующий раз. Отладчики, кэширующие указатели в информацию стека (фреймы и цепочки) должны ее обновлять после изменения указателя инструкции.

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

К началу

Использование операции "Изменить и продолжить"

Во время сеанса отладки можно использовать операцию "Изменить и продолжить" для выполнения следующих задач:

  • Редактирование исходного кода.

  • Перекомпиляция измененного источника.

  • Сохранение состояния времени выполнения исполняемого файла, для которого выполняется отладка.

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

К началу

Функции вычисления

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

Среда CLR позволяет отладчику отменять подобные операции, так как они могут представлять опасность (например, могут вызвать взаимоблокировку в имеющемся коде). Если вычисление прерывается успешно, поток будет считаться потоком, вычисление в отношении которого никогда не выполнялось (за исключением побочных эффектов на локальные переменные ввиду частичного вычисления). Если функция производит вызов в неуправляемый код или каким-либо образом блокирует, завершение вычисления может быть невозможно.

После завершения вычисления функции среды CLR использует обратный вызов для оповещения отладчика о результате выполнения (нормальном завершении или возникновении исключения). Методы ICorDebugValue и ICorDebugValue2 можно использовать для проверки результатов вычисления.

Поток, на котором планируется произвести вычисление функции, должен быть остановлен в управляемом коде на точке, безопасной для сбора мусора. (Вычисление функции также может выполняться для необработанных исключений.) В неоптимизированном коде эти безопасные точки очень распространены; большинство операций точки останова или шаговых операций уровня MSIL будут завершены на одной из них. Однако, в оптимизированном коде такие точки могут быть недостаточно распространены. Иногда во всей функции может не быть ни одной безопасной точки. Частота точек, безопасных для сбора мусора, меняется в зависимости от функции. Остановка на одной из них может не произойти даже в неоптимизированном коде. Как в оптимизированном, так и в неоптимизированном коде метод ICorDebugController::Stop редко завершается на безопасной точке.

Службы отладки среды CLR установят новую цепочку на потоке для запуска вычисления функции и вызова запрошенной функции. Сразу же после запуска вычисления будут доступны все аспекты API отладки: управление выполнением, проверка, вычисление функции и так далее. Вложенные вычисления поддерживаются, точки останова обрабатываются в стандартном режиме.

К началу

Динамическая вставка кода

Некоторые отладчики позволяют пользователю вводить произвольные операторы в окне Immediate и выполнять их. Службы отладки среды CLR поддерживают этот сценарий. Ограничения динамической вставки кода не предусмотрены (в разумных пределах). (Например, использование нелокальных операторов goto не допускается.)

Вставка динамического кода реализуется с помощью операций "Изменить и продолжить" и вычисления функции. Вставляемый код включается в функцию и вставляется с помощью операции "Изменить и продолжить". Затем происходит вычисление вставленной функции. При необходимости для функции-оболочки можно предоставить аргументы, объявленные как ByRef. При этом побочные эффекты будут носить немедленный и постоянный характер.

К началу

Поддерживаемые среды

Средства отладка в среде CLR доступны для всех процессоров и операционных систем, поддерживаемых средой CLR за следующими исключениями.

  • Режим "Изменить и продолжить" и смешанный режим отладки не поддерживаются в 64-разрядных операционных системах. На методы SetIP (ICorDebugILFrame::SetIP и ICorDebugNativeFrame::SetIP) в 64-разрядных операционных системах налагаются дополнительные ограничения. Остальные функциональные возможности эквивалентны для всех процессоров (хотя допускается представление характерных для каждого процессора данных, таких как размеры указателей, контексты регистров и т. п.).

  • Режим "Изменить и продолжить" и смешанный режим отладки не поддерживаются в операционных системах на платформе Win9x. Остальные функциональные возможности должны быть эквивалентными для всех операционных систем. При этом имеются особые исключения, которые отмечены в документации к отдельным функциям.

К началу

Связанные разделы

Заголовок

Описание

Архитектура отладки среды CLR

Описание способов взаимодействия API отладки в среде CLR со средой CLR и отладчиком.

Изменения API отладки в платформе .NET Framework 2.0

Описание изменений и улучшений в отладке в среде платформы .NET Framework версии 2.0.

Предварительные интерфейсы для CorDebug.idl

Описание потребности некоторых интерфейсов отладки среды CLR в пребывании отлаживаемого процесса в определенном состоянии.

Отладка процесса среды выполнения

Пошаговое описание отладки процесса во время выполнения.

Управление программой во время отладки

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

Анализ программы во время отладки

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

Динамическое добавление кода с помощью интерфейса API для отладки

Описание динамического добавления кода, при котором среда CLR перехватывает активный поток для выполнения кода, не представленного в исходном переносимом исполняемом (PE) файле.

Процессы публикации в интерфейсе API для отладки

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

Вопросы безопасности в интерфейсе API для отладки

Анализ вопросов безопасности при использовании API отладки среды CLR.

Компонентные классы отладки

Описывает неуправляемые компонентные классы, используемые API отладки.

Интерфейсы отладки

Описание неуправляемых интерфейсов отладки, управляющих отладкой программы, выполняемой в среде CLR.

Глобальные статические функции отладки

Описывает неуправляемые глобальные статические функции, используемые API отладки.

Перечисления отладки

Описывает неуправляемые перечисления, используемые API отладки.

Структуры отладки

Описывает неуправляемые структуры, используемые API отладки.

К началу