writing mruby debugger

79
Writing mruby debugger Yurie Yamane Masayoshi Takahashi (Team Yamanekko) 2014/11/18 RubyConf 2014

Upload: yamanekko

Post on 08-Jul-2015

2.039 views

Category:

Technology


2 download

DESCRIPTION

RubyConf 2014 presentation

TRANSCRIPT

Page 1: Writing mruby Debugger

Writing mruby debugger

Yurie YamaneMasayoshi Takahashi

(Team Yamanekko)

2014/11/18 RubyConf 2014

Page 2: Writing mruby Debugger

Outline● Who are we?● Why debugger?● What's debugger?● Demo● How mruby and debugger works● Debugger UI (Eclipse plugin)● Conclusion and Future works

Page 3: Writing mruby Debugger

!!! Notice !!!● Technical talk

● including GDB and Eclipse● less Ruby● not fluent C, Java, English● not finished yet

Page 4: Writing mruby Debugger

About us● Yurie Yamane● Masayoshi Takahashi

Page 5: Writing mruby Debugger

Yamanekko

Page 6: Writing mruby Debugger

http://mrb.h2so5.net/

Page 7: Writing mruby Debugger

Tatsu-zine Publishing

Page 8: Writing mruby Debugger

Why Debugger?

Page 9: Writing mruby Debugger

Why debugger?CRuby programmers are not sofamiliar with debugger

irb / pry are your friend

But we think mruby programmersneed debugger→ Why?

Page 10: Writing mruby Debugger

What we had talked

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

http://www.flickr.com/photos/igaiga/8564676738/

Page 11: Writing mruby Debugger

Tools we use now● C● Java

● making our Eclipse Plugin● hacking Eclipse/CDT

● GDB● (a little Ruby)

https://www.gnu.org/software/gdb/mascot/

https://gcc.gnu.org/

http://www.eclipse.org/artwork/

https://www.ruby-lang.org/en/about/logo/

Page 12: Writing mruby Debugger

Why we need mrubydebugger

● targets of mruby● application embedded

● apache / nginx● redis

● microcontroller● RTOS● bare metal

Page 13: Writing mruby Debugger

Why we need mrubydebugger

*.rb

*.c *.rb

bin/ruby

libruby.a

CRuby

mruby

(Your code)

Page 14: Writing mruby Debugger

debugging mruby

C Ruby

(out of focus)

GDB ???

mruby

libruby.a

Page 15: Writing mruby Debugger

mruby sample code

Page 16: Writing mruby Debugger

CRuby debugger● ruby-debug

● < Ruby 2.0● byebug

● >= Ruby 2.0

Page 17: Writing mruby Debugger

porting them to mruby isthe answer?

partially, yes

→ we need another solution

C Ruby

Page 18: Writing mruby Debugger

Our approachmruby debugger on GDB

mruby application

GDB

Front-end

mruby Debugger

Page 19: Writing mruby Debugger

Pros && Cons● Pros

● support C and Ruby● easy to develop

● on the shoulders of giants

● Cons● need GDB, not standalone● a little complicated

Page 20: Writing mruby Debugger

What's Debugger?

Page 21: Writing mruby Debugger

Functions of debugger● Control Execution

● breakpoint● step into / step over / continue

● Show Variables● Show Stacktraces

Page 22: Writing mruby Debugger

Functions of debugger● Control Execution

● breakpoint● step into / step over / continue

● Show Variables● Show Stacktraces

today's topics

Page 23: Writing mruby Debugger

total picture● Eclipse CDT (as frontend)● our library● GDB

● GDB/MI protocol● mrubyVM (libmruby.a)

Page 24: Writing mruby Debugger

total picture

mruby app (bytecode)

GDB

Eclipse CDT

mruby debugger (C)

mruby Debugger (plugin)

mrubyVM (libmruby.a)

GDB/MI

Page 25: Writing mruby Debugger

Demo

Page 26: Writing mruby Debugger

How mruby Works

Page 27: Writing mruby Debugger

Control execution● What we want to do is:

● Suspend execution● Resume execution● show internal status

● We should know how mrubyVMworks

Page 28: Writing mruby Debugger

GDB Missing Manual

● GDB/MI● Conditional Breakpoint● Calling Program Functions

Page 29: Writing mruby Debugger

GDB Missing Manual

● GDB/MI● Conditional Breakpoint● Calling Program Functions

Page 30: Writing mruby Debugger

GDB/MI● Machine Interface protocol

● not for humans● easy to parse

● Eclipse/CDT uses thisGDB command GDB/MI command

run -exec-run

show args -exec-show-arguments

info frame -stack-info-frame

Page 31: Writing mruby Debugger

GDB/MI

Page 32: Writing mruby Debugger

GDB Missing Manual

● GDB/MI● Conditional Breakpoint● Calling Program Functions

Page 33: Writing mruby Debugger

Conditional Breakpointadd conditions to breakpoint

normal breakpoint

conditional breakpoint

Page 34: Writing mruby Debugger

GDB Missing Manual

● GDB/MI● Conditional Breakpoint● Calling Program Functions

Page 35: Writing mruby Debugger

Call function from GDB● GDB can execute C function

● GDB can get return value● CLI: call / print command● GDB/MI: -data-evaluate-expression

Page 36: Writing mruby Debugger

How mrubyVM works● like Instruction pipeline steps

Fetch

Decode

Execute

Write(update status)

Page 37: Writing mruby Debugger

How mrubyVM works● use CODE_FETCH_HOOK

Fetch

Decode

Execute

Write(update status)

CODE_FETCH_HOOK

Page 38: Writing mruby Debugger

CODE_FETCH_HOOK● hook function for debuging● execute after FETCH with each

cycle● when #define ENABLE_DEBUG only

Page 39: Writing mruby Debugger

CODE_FETCH_HOOK

src/vm.c

Page 40: Writing mruby Debugger

code_fetch_hook

include/mruby.h

Page 41: Writing mruby Debugger

ENABLE_DEBUG

include/mrbconf.h

Page 42: Writing mruby Debugger

How mrubyVM works● check status at C_F_HOOK

Fetch

Decode

CODE_FETCH_HOOK set a breakpoint here

Page 43: Writing mruby Debugger

our code_fetch_hook

set a breakpoint here

Page 44: Writing mruby Debugger

Breakpoint: Ruby → C

breakpoint: foo.rb:12Ruby

Cbreakpoint: ???: ???

Page 45: Writing mruby Debugger

Breakpoint: Ruby → C

breakpoint: foo.rb:12Ruby

C breakpoint: hoge.c: 116 if line == 12 && filaname == “foo.rb”

condition

Page 46: Writing mruby Debugger

mrbc: mruby compiler● mrubyVM uses bytecode● bin/mrbc is bytecode compiler

● only compile; do not execute● mrbc -g option

● “-g produce debugging information”● store source filename and line

number to debug

Page 47: Writing mruby Debugger

1 source line != 1 bytecode

v = 2

num = 1

num = v + num

OP_LOADI R1 2 ; R1:v

OP_LOADI R2 1 ; R2:num

OP_MOVE R6 R1OP_MOVE R7 R2OP_ADD R6 :+ 1OP_MOVE R2 R6

source code bytecode

Page 48: Writing mruby Debugger

1 source line != 1 bytecodeSolution

save previous filename andline number

if same line in same file,ignore (do not stop)

Page 49: Writing mruby Debugger

Show Variables● calling C function from GDB● add new functions

● getlocals(mrb): return list of localvars● getlocalValue(mrb, sym): return a localvar

● never called by mruby itself● called by GDB only

Page 50: Writing mruby Debugger

Debugger UI

Page 51: Writing mruby Debugger

Eclipse● Eclipse supports C programming

● CDT● DSF and DSF-GDB (with GDB/MI)

Page 52: Writing mruby Debugger

Eclipse

Eclipse Platform

DSF-GDBDSFC

DT

mruby debugger plugin

debug.uidebug.core

Page 53: Writing mruby Debugger

Eclipse CDT● C/C++ Development Tooling● Parser, Indexer, Editor, Builder, …● Using Eclipse standard

packages/frameworks● Debugger: Eclipse Debug

Framework

Page 54: Writing mruby Debugger

DSF / DSF-GDB● Debugger Service Framework● new framework of CDT● more flexible than old framework

(CDI)● DSF-GDB: GDB debugger using DSF● we use/modify DSF-GDB

Page 55: Writing mruby Debugger

Eclipse mruby debugger

Breakpoint Managerfor mruby

mruby editor(experimental)

mruby variable view GDB Adapterfor mruby

……

Page 56: Writing mruby Debugger

mruby Variable View

mruby Editor

mruby BreakpointMarker

Page 57: Writing mruby Debugger

Marker on *.rb →breakpoint on *.c

linenum: 12path: foo.rb

Marker

foo.rb *.c

CODE_FETCH_HOOK breakpoint

line == 12 &&md_strcmp(filename, “foo.rb”)

Condition

Page 58: Writing mruby Debugger

Breakpoint Manager

mrubyBreakpoint Manager GDB

Breakpoint Manager GDB

C

Ruby

linenum: 12path: foo.rb

Marker

linenum: 12path: foo.c

Marker

break foo.c:12

break XXX.c:YYYif line ==12 && path == “foo.rb”

Page 59: Writing mruby Debugger

mruby Variable View show Name, Type and Value ofvariables

Page 60: Writing mruby Debugger

mruby Variable View hilighting updated values

Page 61: Writing mruby Debugger

get list of variables

C

Ruby

Eclipse

mruby app

GDB

Eclipse GDB

“info locals”

“call getlocals(mrb)” exec getlocals()

return locals (as string)return locals

return locals

Page 62: Writing mruby Debugger

get variable info● get a list of local variables

command

GDB CLI info locals

GDB/MI -stack-list-locals

mruby -data-evaluate-expression getlocals

Page 63: Writing mruby Debugger

variable list format

321,018 25-data-evaluate-expression getlocals(mrb)

321,040 25^done,value=”0x10008c640 \”locals=[{name=\\\”v\\\”,value=\\\”2\\\”,type=\\\”Fixnum\\\”},{name=\\\”num\\\”,value=\\\”1\\\”,type=\\\”Fixnum\\\”},...

-stack-list-locals 1^done,locals=[{name="i",value="0"},{name="k",value="1"}]

for C:

for mruby (command):

for mruby (result):

Page 64: Writing mruby Debugger

get variable info● get a value of variable by name

command

GDB CLI print foo

GDB/MI (using variable object; -var-***)

mruby -data-evaluate-expression getlocalvalue

Page 65: Writing mruby Debugger

Start mruby Debugger

Page 66: Writing mruby Debugger
Page 67: Writing mruby Debugger

Stop at Breakpoint

Page 68: Writing mruby Debugger

Show Variables ● org

● Breakpoint marker filename,line● break

● mruby variable view● GDB Adapter for mruby● ...

Page 69: Writing mruby Debugger

update value of num

Page 70: Writing mruby Debugger

Change Type of v

Page 71: Writing mruby Debugger

Symbol and Hash

Page 72: Writing mruby Debugger

Show arguments ● get local variables● ...

Page 73: Writing mruby Debugger

create new object● get local variables● ...

Page 74: Writing mruby Debugger

call RubyConf#prev● get local variables● ...

Page 75: Writing mruby Debugger

console

Page 76: Writing mruby Debugger

Conclusion

Page 77: Writing mruby Debugger

Conclusion● mruby debugger on GDB

● breakpoints on *.rb● execution control● show variables

Page 78: Writing mruby Debugger

Future Works● mruby stacktrace view● making mrbgem● support step execution● support instance variables &&

class variables

Page 79: Writing mruby Debugger

Thank you!