Как Firebug работает внутри страны?

Я отлаживал JavaScript через Firebug более ста раз, не беспокоясь о том, что происходит там. Я хочу знать, как именно Firebug обрабатывает отладку JavaScript/DOM.

Скажем, я установил точку прерывания на некоторый оператор внутри метода и начал отлаживать. Я хочу знать, что там происходит?

Ответ 1

Когда вы нажимаете на строку для установки точки останова, Firebug записывает URL-адрес файла и номер строки в случае перезагрузки страницы. Затем он просматривает URL/строку в своих внутренних структурах данных, чтобы решить, какую функцию Javascript (называемую "script" в Mozilla) вы хотите остановить. Затем он вызывает функцию платформы Mozilla для сопоставления номера строки с программным счетчиком относительно начала функции. Наконец, он вызывает платформу для установки точки останова на счетчике программ.

Когда вы активировали панель Script, Firebug зарегистрировал обратные вызовы с платформой. Один из них, onBreak, обрабатывает точки останова. Поскольку платформа запускает JS-код, он проверяет свои внутренние структуры, чтобы увидеть, установлен ли текущий счетчик программ. Если это так, он останавливает выполнение JS и обращается к firebug.

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

Сложные части появляются, когда платформа не поддерживает правильный номер строки для сопоставления счетчика программ. Например, Firebug имеет множество кодов для обработки обработчиков событий eval() и браузера.

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

Ответ 2

Firebug использует jsdIDebuggerService, который является службой отладчика.

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