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

JCL*_*CLL 13 ruby bytecode vm-implementation

我想观察YARV执行的Ruby字节码,post-mortem.

我怎么能得到这个?

这里有人说这是不可能的.但是,有一个hotruby框架似乎执行ruby字节码,所以我很困惑......

非常感谢!

whi*_*ark 14

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

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]]]
Run Code Online (Sandbox Code Playgroud)

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

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

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