如何观察YARV执行的Ruby字节码

时间:2011-08-01 09:04:21

标签: ruby bytecode vm-implementation

我想观察一下YARV执行的Ruby字节码,已经过时了。

我怎么能得到这个?

其他人here告诉它是不可能的。但是,有hotruby框架似乎执行ruby字节码,所以我很困惑......

非常感谢!

3 个答案:

答案 0 :(得分:14)

你可以使用解释器将一大块Ruby代码编译成字节码(当然,只有Ruby MRI 1.9可以工作,因为它是唯一使用YARV虚拟机的实现),并得到它的Ruby-是的代表:

ruby-1.9.2-p180 :007 > require 'pp'
 => true
ruby-1.9.2-p180 :008 > pp RubyVM::InstructionSequence.compile('puts "hello world"').to_a
["YARVInstructionSequence/SimpleDataFormat",
 1,
 2,
 1,
 {:arg_size=>0, :local_size=>1, :stack_max=>2},
 "<compiled>",
 "<compiled>",
 nil,
 1,
 :top,
 [],
 0,
 [],
 [1,
  [:trace, 1],
  [:putnil],
  [:putstring, "hello world"],
  [:send, :puts, 1, nil, 8, 0],
  [:leave]]]

这正是HotRuby所做的:它使用MRI作为解析器和AST-to-YARV转换器,然后只用JavaScript执行代码。

您可以使用RubyVM::InstructionSequence.disasm方法获取现有方法的字节码。它期望Proc作为参数,因此首先使用object.method(:name).to_proc将您的方法转换为块。

我不太确定'验尸'是什么意思。在异常处理程序中? Ruby与SEGV发生冲突后?后者几乎不可能,因为解密器无法成功运行任何Ruby代码。你需要为此做一个C扩展,并做很多肮脏的黑客攻击。在异常处理程序中使用此技巧是完全可能的,通过。

答案 1 :(得分:2)

据我了解,RubyVM::InstructionSequence.compile就是您所需要的。

答案 2 :(得分:0)

要获得更具可读性的输出,可以在NSImageView之后使用disasm

compile