我如何跟踪 v8 库中的字节码指令
How can i trace bytecode instructions in v8 library
我在 C++ 项目中使用 v8 库 运行 JavaScript 代码。我想在 运行 时间记录每个字节码指令。
可不可以?或者我只能记录组装说明吗?如果我可以,那怎么办?
trace日志是必须的,不是字节码反汇编的结果
如果您使用的是 d8 shell,您可以传递标志 --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 倍并不意外;确切的数字在很大程度上取决于代码在做什么)。
另外,请注意计算字节码指令将是程序复杂度的一个非常粗略的近似值。例如,单个字节码可以调用执行任意昂贵操作的内置函数。
我在 C++ 项目中使用 v8 库 运行 JavaScript 代码。我想在 运行 时间记录每个字节码指令。 可不可以?或者我只能记录组装说明吗?如果我可以,那怎么办? trace日志是必须的,不是字节码反汇编的结果
如果您使用的是 d8 shell,您可以传递标志 --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 倍并不意外;确切的数字在很大程度上取决于代码在做什么)。
另外,请注意计算字节码指令将是程序复杂度的一个非常粗略的近似值。例如,单个字节码可以调用执行任意昂贵操作的内置函数。