83
How to debug mruby How to debug mruby RubyConf.tw 2014 RubyConf.tw 2014 Team Yamanekko Team Yamanekko Yurie Yamane / Masayoshi Takahashi Yurie Yamane / Masayoshi Takahashi

How to debug mruby (rubyconftw2014)

Embed Size (px)

DESCRIPTION

slides for RubyConf Taiwan 2014

Citation preview

Page 1: How to debug mruby (rubyconftw2014)

How to debug mrubyHow to debug mruby

RubyConf.tw 2014RubyConf.tw 2014Team YamanekkoTeam Yamanekko

Yurie Yamane / Masayoshi TakahashiYurie Yamane / Masayoshi Takahashi

Page 2: How to debug mruby (rubyconftw2014)

自我介紹Who are we?

Page 3: How to debug mruby (rubyconftw2014)

Who are we

●やまね ゆりえ (Yurie Yamane)●高橋征義 (Masayoshi Takahashi)●ちー (Chie)

Page 4: How to debug mruby (rubyconftw2014)

Team Yamanekko

Who are we

Page 5: How to debug mruby (rubyconftw2014)

http://mrb.h2so5.net/

Page 6: How to debug mruby (rubyconftw2014)

電子書出版社

http://tatsu-zine.com/

Tatsu-zine Publishing Inc.

Page 7: How to debug mruby (rubyconftw2014)
Page 8: How to debug mruby (rubyconftw2014)
Page 9: How to debug mruby (rubyconftw2014)

http://ruby-no-kai.org/

Page 10: How to debug mruby (rubyconftw2014)

http://rubykaigi.org/2014

Page 11: How to debug mruby (rubyconftw2014)

http://rubykaigi.org/2015

Page 12: How to debug mruby (rubyconftw2014)

CFP will be opened soon

公開徵求講者

Page 13: How to debug mruby (rubyconftw2014)

our talks

到現在的經歷

Page 14: How to debug mruby (rubyconftw2014)

Our talks

RubyConf.tw 2012

Page 15: How to debug mruby (rubyconftw2014)

Our talks

OSDC.tw 2013

Page 16: How to debug mruby (rubyconftw2014)

RubyConf 2013

https://www.flickr.com/photos/igaiga/10836637785/

Page 17: How to debug mruby (rubyconftw2014)

Demo

演示

Page 18: How to debug mruby (rubyconftw2014)

STM32F4的演示

Push Button

Push Button

Power ON

blinkingmode

tilt sensormode

Page 19: How to debug mruby (rubyconftw2014)

Our problem

我們的問題

Page 20: How to debug mruby (rubyconftw2014)

mruby core

*.rb (stdlib)

*.rb (your code)

C/C++libmruby.a

Bytecode(C String)

mrbgems

Bytecode(C String)

Page 21: How to debug mruby (rubyconftw2014)

mruby core

*.rb (stdlib)

*.rb (your code)

C/C++

mrbgems

Ruby

C

Page 22: How to debug mruby (rubyconftw2014)

mrb_led_toggle

Page 23: How to debug mruby (rubyconftw2014)

debugging in C → Eclipse+CDT

Page 24: How to debug mruby (rubyconftw2014)

debugging in Ruby → ???

Page 25: How to debug mruby (rubyconftw2014)

add breakpoint in C

● aaa● Bbb●

mrbc

breakpoint

mrbgems

C part inApplication

Page 26: How to debug mruby (rubyconftw2014)

add breakpoint in Ruby

● aaa● Bbb●

mrbc

breakpoint

Page 27: How to debug mruby (rubyconftw2014)

Today's Topic

今天的主題

Page 28: How to debug mruby (rubyconftw2014)

Debug

除錯

Page 29: How to debug mruby (rubyconftw2014)

https://www.flickr.com/photos/monkeymashbutton/7618269720/https://www.flickr.com/photos/monkeymashbutton/7618269720/

Page 30: How to debug mruby (rubyconftw2014)

CRuby的除錯

Debugging in CRuby

Page 31: How to debug mruby (rubyconftw2014)

Debugging in CRuby● p || printf● irb● ruby-debug || bybug

Page 32: How to debug mruby (rubyconftw2014)

Debugging in CRuby● p || printf● irb● ruby-debug || bybug

Page 33: How to debug mruby (rubyconftw2014)

mruby/src/vm.c

Page 34: How to debug mruby (rubyconftw2014)

STDIO is an option in mruby

Page 35: How to debug mruby (rubyconftw2014)

Debugging in CRuby

● p || printf● irb● ruby-debug || bybug

Page 36: How to debug mruby (rubyconftw2014)
Page 37: How to debug mruby (rubyconftw2014)
Page 38: How to debug mruby (rubyconftw2014)

Debugging in CRuby

● p || printf● irb● ruby-debug || bybug

Page 39: How to debug mruby (rubyconftw2014)

Debugging in CRuby

● p || printf● irb● ruby-debug || bybug

mruby has no debugger (yet)– 田中先生 will develop mruby debugger (in this year?)

Page 40: How to debug mruby (rubyconftw2014)

Issues in mruby

● embedding into C/C++ apps– mruby's code is just a part of application– We need to debug C/C++ code AND ruby code

● ruby-debug is only Ruby-level debugger– GDB && ruby-debug ??

Page 41: How to debug mruby (rubyconftw2014)

What we want to do● adding breakpoint in Ruby AND C● step over/into/return in Ruby AND C● show stacktrace in Ruby AND C● show variable in Ruby AND C

– it's different from ruby-debug

Page 42: How to debug mruby (rubyconftw2014)

We can do them in C level

https://www.sourceware.org/gdb/

Page 43: How to debug mruby (rubyconftw2014)

our solution

● “hybrid debugger”– C-level debugger + Ruby-level extension– Ruby debugger on GDB

Page 44: How to debug mruby (rubyconftw2014)

How to debug mrubyHow to debug mruby

RubyConf.tw 2014RubyConf.tw 2014Team YamanekkoTeam Yamanekko

Yurie Yamane / Masayoshi TakahashiYurie Yamane / Masayoshi Takahashi

make a debugger tomake a debugger to

Page 45: How to debug mruby (rubyconftw2014)

Our debugger status

● just started (not finished yet Orz)● We talk how it works, showing simple demo with gdb and Eclipse plugin

Page 46: How to debug mruby (rubyconftw2014)

m

http://ruby-hacking-guide.github.io/

Page 47: How to debug mruby (rubyconftw2014)

mrbc and mrubyVM

*.rb *.mrb mrubyVMmrbc

Compile

Ruby Bytecode

Execute

Page 48: How to debug mruby (rubyconftw2014)

mrbc and mrubyVM

*.rb *.mrb mrubyVMmrbc

Compile

Ruby Bytecode

Execute

mruby VM don't seeoriginal code in Ruby

Page 49: How to debug mruby (rubyconftw2014)

bytecode structure

● We made mruby bytecode parser– mrb_parser (v0.0.1)– http://rubygems.org/gems/mrb_parser– https://github.com/yamanekko/mrb_parser

Page 50: How to debug mruby (rubyconftw2014)
Page 51: How to debug mruby (rubyconftw2014)

bytecode structure

RITE Section (Header)

IREP Section

END Section

IREP Record

*.mrb

Page 52: How to debug mruby (rubyconftw2014)

http://commons.wikimedia.org/wiki/File:Dialog-warning-orange.svg

without -g option,mrbc doesn't generate mappings between line numbers of ruby souce code and bytecodes.

Page 53: How to debug mruby (rubyconftw2014)

mrbc and mrubyVM

*.rb *.mrb

Compile

RubyBytecode withdebug section

Executemrbc -g

mrbc mrubyVM

Page 54: How to debug mruby (rubyconftw2014)

bytecode structure

RITE Section(Header)

IREP Section

END Section

IREP Record

DEBUG SectionDEBUG Info

*.mrb

corresponding

Page 55: How to debug mruby (rubyconftw2014)
Page 56: How to debug mruby (rubyconftw2014)

bytecode structure

RITE Section

IREP Section

END Section

IREP Record

DEBUG SectionDEBUG Info

*.mrb

corresponding

Page 57: How to debug mruby (rubyconftw2014)
Page 58: How to debug mruby (rubyconftw2014)
Page 59: How to debug mruby (rubyconftw2014)

i=1+2

p i

Page 60: How to debug mruby (rubyconftw2014)

http://commons.wikimedia.org/wiki/File:Dialog-warning-orange.svg

number of byte code ≠line number of Ruby code

not 1 to 1 mapping

Page 61: How to debug mruby (rubyconftw2014)

mruby VM

Page 62: How to debug mruby (rubyconftw2014)

mruby VM

● src/vm.c● mrb_context_run()● ≒ case statements within loops

Page 63: How to debug mruby (rubyconftw2014)

mrb_context_run()

Page 64: How to debug mruby (rubyconftw2014)
Page 65: How to debug mruby (rubyconftw2014)
Page 66: How to debug mruby (rubyconftw2014)
Page 67: How to debug mruby (rubyconftw2014)

http://commons.wikimedia.org/wiki/File:Dialog-warning-orange.svg

You should defineENABLE_DEBUGin mrbconf.h

Page 68: How to debug mruby (rubyconftw2014)

ENABLE_DEBUG in mrbconf.h

Page 69: How to debug mruby (rubyconftw2014)

mrb_state has code_fetch_hook

Page 70: How to debug mruby (rubyconftw2014)

setting code_fetch_hook function

Page 71: How to debug mruby (rubyconftw2014)
Page 72: How to debug mruby (rubyconftw2014)

GDB demo

Page 73: How to debug mruby (rubyconftw2014)

Eclipse

Page 74: How to debug mruby (rubyconftw2014)

Eclipse + CDT

● CDT = C/C++ Development Tooling– support various toolchains– standard make build– source navigation– various source knowledge tools

Page 75: How to debug mruby (rubyconftw2014)

Eclipse + CDT meets mruby

Eclipse Platform

DSF-GDB

target application(+mruby)

GDB/MI

DSFCDT

mrubydebugger

Page 76: How to debug mruby (rubyconftw2014)

Demo

演示

Page 77: How to debug mruby (rubyconftw2014)

Conclusion

結語

Page 78: How to debug mruby (rubyconftw2014)

Conclusion●programming in mruby is fun●debugging in mruby is hard

●making debugger is harder than that

●Cool tool helps you and makes less hard

Page 79: How to debug mruby (rubyconftw2014)

TODO● step into/step over● show backtrace● show variables

Page 80: How to debug mruby (rubyconftw2014)

Kernel#local_variables

Page 81: How to debug mruby (rubyconftw2014)
Page 82: How to debug mruby (rubyconftw2014)

TODO● extending *.mrb

● adding LVAR section???

Page 83: How to debug mruby (rubyconftw2014)

Thanks!Happy mruby Hacking!

special thanks to: