Я использую библиотеку v8 для запуска кода JavaScript в C++-проекте. И я хочу регистрировать каждую инструкцию байт-кода во время выполнения. Это возможно или нет? Или я могу только логировать инструкцию по сборке? И если я могу, то как? Требуется журнал трассировки, а не результат дизассемблирования байт-кода.
Как я могу отслеживать инструкции байт-кода в библиотеке v8
Ответы (2)
Если вы строите с определенным символом V8_TRACE_IGNITION
(поместив v8_enable_trace_ignition = true
в свой args.gn
), вы можете использовать флаг --trace-ignition
.
Обратите внимание, что V8 оптимизирует горячие функции через некоторое время, после чего они больше не будут выполняться в интерпретаторе и, следовательно, больше не будут отслеживаться. Для ваших целей вы можете отключить это с помощью --noopt
; конечно, это значительно снизит производительность программ с интенсивными вычислениями (в 10 раз медленнее не будет неожиданностью; точное число во многом зависит от того, что делает код).
Кроме того, имейте в виду, что подсчет инструкций байт-кода будет очень грубым приближением сложности программы. Например, один байт-код может вызвать встроенную функцию, выполняющую произвольно затратную операцию.
Если вы используете оболочку d8, вы можете передать флаг --print-bytecode
.
Если вы встраиваете v8, вы можете установить i::FLAG_print_bytecode = true
перед созданием изолята. Вы можете проверить test-api.cc для получения дополнительных примеров использования API.