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扩展,并做很多肮脏的黑客攻击.在异常处理程序中使用此技巧是完全可能的.
| 归档时间: |
|
| 查看次数: |
2197 次 |
| 最近记录: |