在 Nodejs c++ 土地上获取 Local<Function> 的 BytecodeArray
Get the BytecodeArray of a Local<Function> on Nodejs c++ land
我对 nodejs + v8 的代码库有点吃力。
目标是获取函数/模块的字节码(查看代码,它们是相同的)并使用 BytecodeArray::Disassemble
函数对其进行反汇编,可能没有副作用,a.k.a , 执行代码。
问题是一开始就不清楚如何获取字节码
(此处为 V8 开发人员。)V8 的 API 不提供对函数字节码的访问。这是故意的,因为字节码是一个内部实现细节。对于检查字节码,--print-bytecode
标志是必经之路。
如果你坚持要弄脏内部细节,那么你当然可以绕过 public API 并戳戳 V8 的内部结构。从 v8::internal::JSFunction
可以到达 v8::internal::SharedFunctionInfo
,检查它是否 HasBytecodeArray()
,如果是,则调用 GetBytecodeArray()
。反汇编字节码永远不会有副作用,也永远不会执行字节码。一个函数在给定的时刻完全有可能没有字节码——字节码是在需要的时候懒惰地创建的,如果有一段时间没有被使用就被丢弃。如果你挖得够深,你也可以干扰这些机制,但是......:[=15=]
不用说,访问内部细节 完全不受支持,不推荐 ,即使你让它在 Node 版本 x.y 中工作,它也可能会中断x.(y+1),因为这就是“内部细节”的意思。
我对 nodejs + v8 的代码库有点吃力。
目标是获取函数/模块的字节码(查看代码,它们是相同的)并使用 BytecodeArray::Disassemble
函数对其进行反汇编,可能没有副作用,a.k.a , 执行代码。
问题是一开始就不清楚如何获取字节码
(此处为 V8 开发人员。)V8 的 API 不提供对函数字节码的访问。这是故意的,因为字节码是一个内部实现细节。对于检查字节码,--print-bytecode
标志是必经之路。
如果你坚持要弄脏内部细节,那么你当然可以绕过 public API 并戳戳 V8 的内部结构。从 v8::internal::JSFunction
可以到达 v8::internal::SharedFunctionInfo
,检查它是否 HasBytecodeArray()
,如果是,则调用 GetBytecodeArray()
。反汇编字节码永远不会有副作用,也永远不会执行字节码。一个函数在给定的时刻完全有可能没有字节码——字节码是在需要的时候懒惰地创建的,如果有一段时间没有被使用就被丢弃。如果你挖得够深,你也可以干扰这些机制,但是......:[=15=]
不用说,访问内部细节 完全不受支持,不推荐 ,即使你让它在 Node 版本 x.y 中工作,它也可能会中断x.(y+1),因为这就是“内部细节”的意思。