Как я могу отследить инструкции байт-кода в библиотеке v8

Я использую библиотеку v8 для запуска кода JavaScript в C++- проекте. И я хочу регистрировать каждую инструкцию байт-кода во время выполнения. Это возможно или нет? Или я могу только войти в инструкцию по сборке? И если я могу, то как? Требуется журнал трассировки, а не результат дизассемблирования байт-кода.

2 ответа

Если вы используете оболочку d8, вы можете передать флаг --print-bytecode,

Если вы встраиваете v8, вы можете установить i::FLAG_print_bytecode = true перед созданием изолята. Вы можете проверить test-api.cc для большего количества примеров использования API.

Если вы строите с V8_TRACE_IGNITION символ определяется (поставив v8_enable_trace_ignition = true в ваш args.gn), вы можете использовать флаг --trace-ignition,

Обратите внимание, что V8 оптимизирует горячие функции через некоторое время, после чего они больше не будут работать в интерпретаторе и, следовательно, больше не будут отслеживаться. Для ваших целей вы можете отключить это с --noopt; конечно, это значительно снизит производительность вычислительных программ (в 10 раз медленнее не будет неожиданностью; точное число во многом зависит от того, что делает код).

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

Другие вопросы по тегам