gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:21 24 4
gpt4 key购买 nike

我想观察 YARV 执行的 Ruby 字节码,事后分析。

我怎样才能得到这个?

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

非常感谢!

最佳答案

你可以很好地使用解释器将一大块 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]]]

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

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

我不太清楚您所说的“验尸”是什么意思。在异常处理程序中?在 Ruby 与 SEGV 崩溃之后?后者几乎不可能,因为损坏的解释器无法成功运行任何 Ruby 代码。你需要为此做一个 C 扩展,并做很多肮脏的黑客攻击。在异常处理程序中使用这个技巧是完全可能的。

关于ruby - 如何观察YARV执行的Ruby字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6896221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com