diff options
author | Aaron Patterson <tenderlove@ruby-lang.org> | 2021-01-21 14:05:11 -0800 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2021-10-20 18:19:27 -0400 |
commit | 11512a80fce8bfac3adf7038e9d9e3839e5cbbfb (patch) | |
tree | 21ddfb9486e9e1e0f7d91952416daf1997a80732 /misc | |
parent | d9176d9fca1af8750f9d8f97586e150d9261cc7f (diff) |
add a helper script for ujit disasm
Diffstat (limited to 'misc')
-rw-r--r-- | misc/ujit_disasm.rb | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/misc/ujit_disasm.rb b/misc/ujit_disasm.rb new file mode 100644 index 0000000000..0e54f952c9 --- /dev/null +++ b/misc/ujit_disasm.rb @@ -0,0 +1,34 @@ +begin +require "crabstone" +require "stringio" + +module UJIT + def self.disasm(iseq) + blocks = UJIT.blocks_for(iseq) + return if blocks.empty? + + io = StringIO.new + + cs = Crabstone::Disassembler.new(Crabstone::ARCH_X86, Crabstone::MODE_64) + + io.puts iseq.disasm + + blocks.sort_by(&:address).reverse.each do |block| + io.puts "== ISEQ RANGE: #{block.iseq_start_index} -> #{block.iseq_end_index} ".ljust(80, "=") + cs.disasm(block.code, 0).each do |i| + io.printf( + "\t0x%<address>x:\t%<instruction>s\t%<details>s\n", + address: i.address, + instruction: i.mnemonic, + details: i.op_str + ) + end + end + io.string + end +end +rescue + puts "Please install crabstone like this:" + puts " $ brew install capstone" + puts " $ gem install capstone" +end |