HOME>リンク
 

mruby debugger 操作マニュアル


本書は、mrubyデバッガ(mrdb)の操作方法について記載したものです。

使用方法
2.1 ビルド方法

githubよりmrubyデバッガを含むmrubyソースコードを入手し、ソースコードをmakeします。

$ git clone https://github.com/Kumikomi-Ruby/forum-mruby.git mruby
$ cd mruby
$ make

ビルドによって生成された実行ファイルはmruby/binに格納されるため、必要に応じてパスを通して下さい。

$ echo "export PATH=\$PATH:MRUBY_ROOT/bin" >> ~/.bashrc
$ source ~/.bashrc

MRUBY_ROOTはmrubyソースコード格納ディレクトリ

mrubyデバッガ(mrdb)を実行できることを確認します。

$ mrdb --version
mruby 1.1.0 (2014-11-19)

2.2 基本操作

2.2.1. mrubyスクリプト(rbファイル)のデバッグ

mrubyデバッガにデバッグ対象のmrubyスクリプトファイルを指定することで、mruby(Ruby)スクリプトのデバッグが開始されます。

$ mrdb [オプション] ファイル名

例: sample.rbをデバッグする

$ mrdb sample.rb

mrubyデバッガが起動されると下記のようなプロンプトが表示され、コマンド入力待ちとなります。 mrubyデバッガでは以下のデバッグコマンドが利用可能です。

  • runコマンド(プログラムの実行)
  • stepコマンド(プログラムのステップ実行)
  • continueコマンド(プログラムの継続実行)
  • breakコマンド(ブレイクポイントの設定)
  • deleteコマンド(ブレイクポイントの削除)
  • disableコマンド(ブレイクポイントの無効化)
  • enableコマンド(ブレイクポイントの有効化)
  • info breakpointsコマンド(ブレイクポイント一覧表示)
  • printコマンド(式の評価)
  • evalコマンド(式の評価)
  • listコマンド(ソースコードの表示)
  • helpコマンド(ヘルプ表示)
  • quitコマンド(mrubyデバッガの終了)

各コマンドの詳細については 3. コマンド使用 を参照して下さい。

2.2.2. バイナリ(mrbファイル)のデバッグ

mrubyデバッガは、mrubyバイナリファイル(mrbファイル)のデバッグも可能です。 バイナリのデバッグは以下の手順で行います。

2.2.2.1. デバッグコンパイル mrubyコンパイラでコンパイルする際にデバッグオプション(-g)を指定してコンパイルを行います。

$ mrbc -g sample.rb

注意: -gオプション指定なしでコンパイルしたmrubyバイナリファイルはデバッグ操作が行えません。

mrubyバイナリをデバッグする場合には、-bオプションを指定してmrubyデバッガを起動します。

$ mrdb -b sample.mrb

3.コマンド仕様

- breakコマンド

指定した行番号、メソッドにブレイクポイントを設定する。

break [file:]lineno
b [file:]lineno
break [class:]method
b [class:]method

引数 内容
file ファイル名(.rb)
lineno 行番号
class クラス名
method メソッド名

指定された[file:]lineno,または[class:]methodにブレイクポイントを設定します。ブレイクポイントが設定できた場合はブレイクポイントの情報を、ブレイクポイントが設定できなかった場合はエラーを表示します。

設定したブレイクポイントには番号(1から開始)を付与します。番号は1から順にインクリメントされます。deleteコマンドにより削除されたブレイクポイントの番号は欠番となり、同一番号は付与しません。

同一箇所に対する複数のブレイクポイント設定は可能です。クラス名,メソッド名の有効/無効チェックは実施していません。無効な行番号が設定された場合、以降の有効な行番号にブレイクポイントを設定します。以降に有効な行番号が存在しない場合はエラー表示します。

*C言語で実装されたメソッドはmrdbではデバッグできません。GDB等を使用してください。

Example:

(ファイル)行番号を指定する例

> break sample.rb:3
Breakpoint 1: file sample.rb, line 3.

(クラス)メソッドを指定する例

> break Sample_class:sample_method
Breakpoint 1: class Sample_class, method sample_method

- continueコマンド

停止中のプログラムの実行を再開する.

continue [N]
c [N]

引数 内容
N 次回停止するブレークポイントの指定

ブレークポイント等で停止したプログラムの実行を再開する.

N を引数として与えた場合は,実行再開後の N-1 個のブレークポイントを無視し,N 個 目のブレークポイントで停止する.

N を省略した場合は,実行を再開し,最初のブレークポイントで停止する.すなわち,N を省略した場合は, N=1 と解釈される.

プログラムの末尾に到達した状態で実行すると,以下のメッセージが表示され,プログラムの実行を再開することはできない.The program is not running.

- deleteコマンド

指定したブレイクポイントを削除する

delete [breakpointno]
d [breakpointno]

引数 内容
breakpointno ブレイクポイント番号

breakpointnoで指定したブレイクポイントを削除します。番号の指定が無い場合は,全てのブレイクポイントを削除します。 スペース区切りで番号を指定することで,複数ブレイクポイントを削除することも可能です。

to be continued

 

 

 

 

 

 

 

 

 

mrubyバイナリをデバッグする場合には、-bオプションを指定してmrubyデバッガを起動します。


・GIT(mrubyソースのアップデート及びmrbgemsの取り込みを容易にします)
・C++コンパイラ(*.cpp、*.cxx、*.ccを含むGEMsを利用するために)
・アセンブラー(*.asmを含むGemsを利用するために)

使用法

mrubyソースのルートディレクトリ内にbuild_conf.rbというファイルがあります。このファイルはmrubyのビルドコンフィグレーションを含んでいます。

MRuby::Build.new do |conf|
toolchain :gcc
end

mrubyのコンパイルに必要なツールはここにセットされます。追加のbuild_config.rbは$MRUBY_CONFIG環境変数で定義できます。

コンパイルするにはmrubyソースルートの./minirakeを実行するだけです。テストツールの実行には./minirake testを実行してください。 Clean allには./minirake cleanを実行します。コマンドラインを確認するには./minirake -vを実行します。
お使いの環境に併せてBuild_config.rbのオプションの変更が可能です

Build Configuration

青 Toolchains

お使いのPCに併せてビルド環境の設定変更できるtoolchainのテンプレートが用意されています。

青 GCC

GNC Cコンパイラを使うToolchainのコンフィグ

toolchain :gcc

青 Clang

LLVM C コンパイラー用Toolchainコンフィグ例、GCC Toolchainとほぼ同じです

toolchain :clang

青 Visual Studio 2010,2012 と 2013

Windows Visual Studio用のToolchainコンフィグレーションです。Visual Studio Command promptをお使いになる場合、ビルドプロセスが自動で設定しますので手動で設定する必要はありません。

toolchain :visualcpp

青 Android

Android用Toolchainコンフィグ

toolchain :androideabi

カスタムスタンドアローンAndroid SDKとToolchainへのパス ANDROID_STANDALONE_TOOLCHAIN.が必要です。

青 Binaries

コンパイル時に以下のツールより必要なものを選択可能です。

・mruby (mruby interpreter)
・mirb (mruby interactive shell)

選択する際に以下のように記述します。

conf.gem "#{root}/mrbgems/mruby-bin-mruby"
conf.gem "#{root}/mrbgems/mruby-bin-mirb"

青 File Separator

環境により様々なファイルセパレータが必要です。conf.file_separatorにキャラクタをセットできます。

conf.file_separator = '/'

青 C Compiler

Cコンパイラバイナリ、フラグ、インクルードパスの設定の仕方

conf.cc do |cc|
 cc.command = ...
 cc.flags = ...
 cc.include_paths = ...
 cc.defines = ...
 cc.option_include_path = ...
 cc.option_define = ...
 cc.compile_options = ...
end

Cコンパイラはインストールライブラリを認識するヘッダーサーチャーをもっています。

ヘッダーファイルのインクルードパスを使うには search_header_path:を使います

# Searches ```iconv.h```.
# If found it will return include path of the header file.
# Otherwise it will return nil .
fail 'iconv.h not found' unless conf.cc.search_header_path 'iconv.h'

ヘッダーファイルの完全名が必要な場合、search_header_を使います

# Searches ```iconv.h```.
# If found it will return full path of the header file.
# Otherwise it will return nil .
iconv_h = conf.cc.search_header 'iconv.h'
print "iconv.h found: #{iconv_h}\n"

ヘッダーサーチャーは通常、コンパイラーのinclude_pathsを利用します。GCC Toolchainを使う場合(clang toolchainを含む)インクルードパスを使います。(例:/usr/local/include, /usr/include)

シングルトンメソッドを定義する場合、Cコンパイラーに特別なヘッダーパス header_search_pathsが必要です

 def conf.cc.header_search_paths

  ['/opt/local/include'] + include_paths

end

青 Linker

リンカーバイナリ、フラグ、ライブラリパスの設定

conf.linker do |linker|
 linker.command = ...
 linker.flags = ...
 linker.flags_before_libraries = ...
 linker.libraries = ...
 linker.flags_after_libraries = ...
 linker.library_paths = ....
 linker.option_library = ...
 linker.option_library_path = ...
 linker.link_options = ...
end

青 Archiver

アーカイバのバイナリとフラグの設定

conf.archiver do |archiver|
 archiver.command = ...
 archiver.archive_options = ...
end

青 Parserジェネレーター

パーサージェネレーターのバイナリとフラグの設定

conf.yacc do |yacc|
 yacc.command = ...
 yacc.compile_options = ...
end

青 GPref

Gprefバイナリとフラグの設定

conf.gperf do |gperf|
 gperf.command = ...
 gperf.compile_options = ...
end

青 File extensions

conf.exts do |exts|
 exts.object = ...
 exts.executable = ...
exts.

青 Mrbgems

Gemsをビルドプロセスに取り込むには

# Integrate GEM with additional configuration
conf.gem 'path/to/gem' do |g|
 g.cc.flags << ...
end

# Integrate GEM without additional configuration
conf.gem 'path/to/another/gem'

Mrbtest

Mrbtestをビルドプロセスに取り込む

mrbtestのみ組み込みたい場合、conf.build_mrbtest_lib_onlyのみお使いください

conf.build_mrbtest_lib_only

青 Bintest

CRubyを使ったmrubtest toolsのテスト。bintestの場所はmrbgemsディレクトリのbintest/。サンプルはmruby-bin-*/bintest/*.rbをご覧ください。

有効化

conf.enable_bintest

青 C++ ABI

mrubyはC++例外処理を内部的に実行できます。C++ABIモードと呼ばれています。C++例外処理はC++スタックを正しくリリースします。C++コードをミックスする際は必ずC++ABIモードは自動的に利用可能になります。 明示的にC++ABIモードを有効にしたい場合、下記のように記述します。

conf.enable_cxx_abi

青 C++例外処理 無効化

 C++無効化の記述

conf.disable_cxx_exception

注意:これはenable_cxx_abiかGemの前にコールされる必要があります

青 デバッギング モード

デバッグのモードの有効化

conf.enable_debug
デバッグモードが有効になった場合

・マクロ MRB_DEBUGが定義されます これは mrb_assert() マクロが有効になっています

・irepのデバッグ情報がmrbcにより生成されます

これは-gフラグがmrbcランナーにより追加されるためです

これを使い、よりよいバックトレースの実行が可能です

青 Cross Compilation

mrubyは一つのプラットフォームから他のプラットフォームへのクロスコンパイルが可能です。これにはbuild_config.rb内にMRuby:CrossBUildのインスタンスが含まれている必要があります。このインスタンスはクロス編集とターゲットプラットフォームのフラグを定義しています。下記を参考にしてください

MRuby::CrossBuild.new('32bit') do |conf|
 toolchain :gcc

 conf.cc.flags << "-m32"
 conf.linker.flags << "-m32"
end

MRuby::Buildで利用できる設定オプションはすべてMRuby::CrossBuildで利用可能です

青 Cross Compilation時のMrbtest

クロスコンパイル時にmrbtestを実行できます

conf.test_runner do |t|
 t.command = ... # set emulator. this value must be non nil or false
 t.flags = ... # set flags of emulator

 def t.run(bin) # override `run` if you need to change the behavior of it
 ... # `bin` is the full path of mrbtest
 end
end

青 Build Process

ビルド時にルートディレクトリにディレクトリが作成されます。ディレクトリ構成を下記に示します

+- build
 |
 +- host
  |
  +- bin <- Binaries (mirb, mrbc and mruby)
  |
  +- lib <- Libraries (libmruby.a and libmruby_core.a)
  |
  +- mrblib
  |
  +- src
  |
  +- test <- mrbtest tool
  |
  +- tools
    |
    +- mirb
    |
    +- mrbc
    |
    +- mruby

コンパイルの流れは下記のようになります

・src配下にすべてのファイル(オブジェクトファイルはbuild/host/srcに保管されます)

src/parse.yよりパーサーグラマーが生成されます(生成結果はbuild/host/src/y.tab.cに保存されます)

・ build/host/src/y.tab.cbuild/host/src/y.tab.oにコンパイルされます

・すべてのオブジェクトファイルよりbuild/host/lib/libmruby_core.aがコンパイルされます

tools/mrbc/mrbc.cがコンパイルされ、build/host/lib/libmruby_core.aとリンクされてbuild/host/bin/mrbcが生成されます

・build/host/bin/mrbcのmrblib配下のすべてのrbファイルをコンパイルすることでbuild/host/mrblib/mrblibが生成されます

build/host/mrblib/mrblib.cbuild/host/mrblib/mrblib.oにコンパイルされます

・すべてのオブジェクトファイルよりbuild/host/lib/libmruby.aが作成されます

(CとRuby)

mrbgems/mruby-bin-mruby/tools/mruby/mruby.c のコンパイルとbuild/host/lib/libmruby.aへのリンクによりbuild/host/mrubyが生成されます

mrbgems/mruby-bin-mirb/tools/mirb/mirb.cのコンパイルとbuild/host/lib/libmruby.aへのリンクよりbuild/host/bin/mirbが生成されます

  ----- to be continued ------