Top Banner
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
83

How to debug mruby (rubyconftw2014)

May 12, 2015

Download

Technology

yamanekko

slides for RubyConf Taiwan 2014
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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: