Как я могу отследить инструкции байт-кода в библиотеке 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 раз медленнее не будет неожиданностью; точное число во многом зависит от того, что делает код).
Также имейте в виду, что подсчет инструкций байт-кода будет очень приблизительным приближением к сложности программы. Например, один байт-код может вызвать встроенную функцию, которая выполняет сколь угодно дорогую операцию.