本書は、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.cがbuild/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.cがbuild/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 ------
|