MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

API отладчика

Интерфейс Debugger

SpiderMonkey, Mozilla’вский движок JavaScript, предоставляет интерфейс для отладки Debugger, позволяющий коду на JavaScript следить за и управлять выполнением другого кода на JavaScript. Как встроенные в Firefox инструменты разработчика, так и дополнение Firebug используют интерфейс Debugger для реализации своих собственных отладчиков JavaScript. Однако, интерфейс Debugger является немного более обобщённым и может использоваться для реализации других видов инструментов, включая трассировщики, анализаторы покрытия, инструменты редактирования-по-месту и прочие.

Debugger обладает тремя основными качествами:

  • Это интерфейс уровня исходного кода: он оперирует не в терминах машинного языка, а языка JavaScript. Он оперирует над объектами JavaScript, стековыми кадрами, окружениями и кодом, и предоставляет единый интерфейс в не зависимости от того, отлаживается интерпретируемый, скомпилированный или оптимизированный код. Если вы хорошо владеете JavaScript’ом, у вас есть всё необходимое для успешной работы с интерфейсом Debugger, даже если вы никогда не заглядывали с реализацию языка.
  • Он предназначен для использования из кода на JavaScript. JavaScript является одновременно и отлаживаемым языком, и языком реализации инструмента, так что те качества, что делают JavaScript эффективным в вебе, могут использоваться при создинии инструментов для разработчиков. Как и ожидается от JavaScript API, Debugger является звуковым интерфейсом (sound interface): использование (или даже неправильное использование) Debugger’а ни в коем случае не должно приводить Gecko к падению. Ошибки выбрасывают соответствующие исключения JavaScript.
  • Он является внутрипоточным отладочным API. Как отлаживаемый код, так и код, использующий Debugger, должны работать в одном и том же потоке. Кросс-поточные, кросс-процессные инструменты и инструменты между разными устройствами должны использовать Debugger для наблюдения за отлаживаемым кодом из того же самого потока, в котором запущен этот код, а затем самостоятельно обрабатывать любые необходимые коммуникации. (Встроенные в Firefox инструменты разработки имеют протокол, специально разработанный для этих целей.)

В Gecko, API Debugger доступно только в коде chrome. По своему дизайну он не должен оставлять дыр в безопасности, так что в принципе, он мог бы достучаться до содержимого; но это сильно повышает риски безопасности в плоскости дополнительных атак.

Экземпляры отладчика и теневые объекты

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

Здесь показана программа на JavaScript в процессе запуска функции обратного вызова по таймеру:

Запущенная программа на JavaScript и её теневой отладчик

Запущенная программа на JavaScript и её теневой отладчик

Эта диаграмма показывает различные типы теневых объектов, создаваемых API отладчика (все из которых следуют некоторым общим соглашениям):

  • Debugger.Object представляет отлаживаемый объект, предлагая API, ориентированное на рефлексию, защищающее отладчик от случайного выполнения геттеров, сеттеров, прокси-ловушек и так далее.
  • Debugger.Script представляет блок JavaScript-кода — это либо тело функции, либо скрипт верхнего уровня. Данный Debugger.Script самостоятельно может устанавливать точки останова, переводить позиции в исходном коде в смещения в байт-коде и наоборот (отклонение от принципа «уровня исходного кода») и находить другие статистические характеристики кода.
  • Debugger.Frame представляет выполняющийся стековый кадр. Вы можете использовать его для обхода стека и нахождения скрипта и окружения каждого кадра. Также вы можете установить на кадры обработчики onStep и onPop.
  • Debugger.Environment представляет окружение, ассоциирующее имена переменных с позициями в хранилище. Окружения могут принадлежать к выполняющемуся стековому кадру, захваченному функциональным замыканием, или отражать некоторые свойства глобального объекта в качестве переменных.

Сам экземпляр Debugger не является теневым объектом какого-либо объекта в отлаживаемом коде; скорее, он поддерживает множество глобальных объектов, которые рассматриваются как отлаживаемые. Debugger наблюдает выполнение только в области видимости этих глобальных объектов. Вы можете установить функции, которые будут вызываться при заталкивании нового кадра в стек, при загрузке нового кода и так далее.

На этой картинке опущены экземпляры Debugger.Source, представляющие единицы компиляции JavaScript. Debugger.Source может предоставить полную копию своего исходного кода и объяснить, как этот код попал в систему, через вызов функции eval, через элемент <script> или как-нибудь ещё. Debugger.Script указывает на Debugger.Source, из которого он был получен.

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

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

Все теневые объекты являются уникальными на один экземпляр Debugger и объекта, на него ссылающегося. Для заданного экземпляра Debugger существует только один экземпляр Debugger.Object, ссылающийся на соответствующий отлаживаемый объект; только один экземпляр Debugger.Frame для каждого соответствующего кадра стека и так далее. Таким образом, инструмент может хранить метаданные о теневом объекте в качестве свойства самого теневого объекта, и рассчитывать на то, что они будут найдены при последующем обращении к нему. И поскольку теневые объекты существуют для каждого экземпляра Debugger, инструменты могут не беспокоиться о вмешательстве со стороны других инструментов, поскольку те используют свои собственные экземпляры Debugger.

Примеры

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

Возможности, присутствующие только в Gecko

Хотя основное API Debugger работает только с общими для любой реализации JavaScript концепциями, оно также включает в себя некоторые возможности, присущие только Gecko:

  • [Глобальное отслеживание][global] поддерживает отладку всего кода, запущенного в экземпляре Gecko, за раз — так называемая модель «отладки chrome» (‘chrome debugging’).
  • Функции, [оборачивающие объект][wrapper], помогают манипулировать ссылками на объект, пересекающими привелегированные границы (cross privilege boundaries).

Метаданные исходного документа

Сгенерировано из файла:
js/src/doc/Debugger/Debugger-API.md
Водяной знак:
sha256:eb7bc6731f5c90a4e0fcd6b171cb5a2f2c7e118335f60b8f03e1118793aad6b3
Набор изменений:
46e56275f2b2

Метки документа и участники

 Внесли вклад в эту страницу: Mingun
 Обновлялась последний раз: Mingun,