Добро пожаловать в другие главы Давайте разберемся с 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]