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

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


person Alexey Novikov    schedule 18.04.2018    source источник


Ответы (2)


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

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

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

person jmrk    schedule 19.04.2018

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

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

person Superfly    schedule 18.04.2018
comment
Спасибо. Но мне нужен не результат декомпиляции байткода, а именно лог его выполнения. Список всех выполненных инструкций байт-кода. Я не знаю, возможно ли это. - person Alexey Novikov; 18.04.2018
comment
Мы хотим оценить сложность кода JavaScript по количеству и типам выполняемых инструкций байт-кода. - person Alexey Novikov; 18.04.2018