Добро пожаловать в другие главы Давайте разберемся с Chrome V8

Отладка, несомненно, является наиболее эффективным способом анализа V8, но, к сожалению, большую часть кода V8 трудно отлаживать. Большинство частей кода ядра V8 реализованы с помощью CodeStubAssembler, а именно CSA. Можно грубо подумать, что CSA — это язык ассемблера. Отладка сборки недопустима, не говоря уже об отладке в таком огромном проекте V8.

Есть ли способ упростить нашу отладку? В этой статье я расскажу о своем опыте отладки встроенных программ. В частности, я хотел бы поговорить о том, как отлаживать байт-код. Хотите увидеть подробности выполнения байт-кода? Пойдем! Конечно, вы также можете пропустить эти скучные теории и перейти к Разделу 3.

Совет. Версия 8 в основном реализована на двух языках: C++ и ассемблере. В частности, байт-коды реализованы в CSA.

1. Время выполнения

Что такое время выполнения? Помогает ли это в отладке байт-кода? Да конечно!

Большая часть среды выполнения в V8 написана на C++, и среда выполнения и байт-код могут вызывать друг друга. Во время выполнения байт-кода мы можем вручную вызвать среду выполнения, чтобы вернуться в среду C++, в которой нам легче наблюдать за деталями. Это помощь, которую дает среда выполнения.

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

Вышеприведенный код представляет собой шаблон макроса среды выполнения, каждая строка представляет собой функцию среды выполнения, и вы можете увидеть весь код в runtime.h.

Я подробнее остановлюсь на примере в строке 25. Ключевое слово F — это макрос, число 2 — это счетчик параметров, а число 1 — это счетчик возвращаемого значения. Ключевое слово I также является макросом (см. строку 11).

Код NewObject приведен ниже.

В приведенном выше коде RUNTIME_FUNCTION по-прежнему является макросом. Мы расширяем его, чтобы получить полный код NewObject, который находится ниже.

Приведенный выше код выполняется в среде C++, поэтому его можно отлаживать с помощью кода C++.

2. Создание среды выполнения

Я резюмирую создание среды выполнения двумя моментами:

  • Класс Runtime, содержащий все имена функций среды выполнения.

Если вы определите новую функцию, имя также появится в этом перечислении.

  • runtime_table — это массив указателей, который содержит адреса всех функций времени выполнения. Этот массив управляется v8::i::islolate. Вам нужно выбрать место для добавления среды выполнения. Ниже мое время выполнения.

Последняя строка — это моя функция, имя — MyRuntime, она имеет один параметр и одно возвращаемое значение, а код приведен ниже.

В приведенном выше коде строка 1 RUNTIME_FUNCTION является макросом V8. Строка 2 — это SealHandleScope (о ней будет рассказано в следующей статье). В строке 4 вы можете написать свой код, а именно тело функции.

Ниже приведен способ вызова MyRuntime в байт-коде — LdaConstant.

Во время выполнения LdaConstant вызывается MyRuntime. На рисунке 1 показан стек вызовов MyRuntime.

3. Пасхальное яйцо

На самом деле в V8 есть несколько функций, которые можно использовать для отладки встроенных функций, таких как байт-код, таких как Runtime_DebugPrint:

В приведенном выше коде void Print(const char* s) определен в code-stub-assembler.h. Печать — это пасхальное яйцо, как я сказал. С помощью Print вы можете выводить информацию при выполнении байт-кода. Технология, лежащая в основе Print, — это вызов друг друга между Runtime и Bytecode, о котором я упоминал выше, потому что 22-я строка вызывает Runtime_DebugPrint в 1-й строке.

Хорошо, на этом мы закончили. Увидимся в следующий раз, берегите себя!

Мой блог cncyclops.com. Пожалуйста, свяжитесь со мной, если у вас есть какие-либо проблемы.

WeChat: qq9123013 Электронная почта: [email protected]