デバッグ
mrdebugによるRubyレベルのインタラクティブなデバッグ。
ブレークポイント、ステップ実行、ローカル変数の確認といったRubyレベルのデバッグを
行うには、mrdebug(picoruby-debug
から改名)を設定に追加します。対応しているのはPicoRuby
(mruby)VMのみです。FemtoRuby(mruby/c)にはこれが使うデバッグフックが
存在しません。
# components/picoruby-esp32/build_config/xtensa-esp-picoruby.rb (または riscv-*) 内
conf.gem github: 'yuuu/mruby-debug', path: 'console'
path: 'console'のサブgemが、以下で使うデバイスのコンソール上の
(mrdbg)プロンプトを追加するものです。これを外してもmrdebug自体は
使えますが、その場合デバイスはローカルでプロンプトを出す代わりに、常に
TCPポート4711で待ち受けるようになります(Wi-Fi経由のリモートデバッグを参照)。
Note: PicoRubyのタスクスタックも最低32768バイトまで引き上げてください —
PICORB_TASK_STACK_SIZE=32768(スタックの拡張を参照)。デフォルトの8KBでは、 デバッガが停止した時点でオーバーフローします。
ブレークポイント
スクリプトにbinding.debuggerを挿入します。requireは不要です。
def add(a, b)
a + b
end
x = 1
binding.debugger # または binding.b / binding.break
y = add(x, 2)
puts y
これを実行するとbinding.debuggerの行で一時停止し、既存のシリアル接続上で
インタラクティブなプロンプトに入ります。
$> ./script.rb
Stop: script.rb:6
(mrdbg)
(mrdbg)プロンプトでの主なコマンド:
| コマンド | エイリアス | 説明 |
|---|---|---|
continue |
c、空入力 |
次のブレークポイントまで再開 |
step [<n>] |
s |
呼び出し先にも入りながら次に実行される行で停止 |
next [<n>] |
n |
同じ/より浅いフレームの次の行で停止 |
finish |
fin |
選択中のフレームがreturnするまで実行 |
break [<file>:]<line> [if <expr>] |
b |
ブレークポイントを追加(引数なしなら一覧表示) |
break <Class>#<method> |
b |
メソッドブレークポイントを追加(#はインスタンス、.は特異メソッド) |
watch [<expr>] |
<expr>の値が変化するたびに停止 |
|
print <expr> |
p |
選択中のフレームに対して<expr>を評価して表示 |
backtrace |
bt / where |
コールスタックを表示 |
help [<command>] |
h |
コマンド一覧、または<command>の使い方を表示 |
コマンドの全リファレンス(フレーム移動、表示式など)は mrdebugのREADMEを参照してください。
Wi-Fi経由のリモートデバッグ
ビルドにpicoruby-socketも含まれている場合(Wi-Fiを有効にする
のUSE_WIFI=1はこのためにあります)、mrdebugは上記のオンデバイスコンソール
プロンプトの代わりに(あるいはそれと併用して)TCPポートで待ち受けることが
できます。consoleサブgemを使っている場合、これはオプトインです。
storage/etc/config.ymlにmrdebug_portを設定してください(R2P2は起動時に
env:セクションをENVへ読み込みます)。
env:
mrdebug_port: 4711
または、そのシェルセッション限りでよければ、スクリプトを実行する前に
export MRDEBUG_PORT=4711します。これで、次のbinding.debuggerで
デバイスはローカルの(mrdbg)プロンプトを開く代わりに、クライアントの
接続を待つようになります。
パソコン側からは、mruby-debug
リポジトリのホストビルドで得られるmrdbgCLIで接続します。
$ mrdbg --host 192.168.0.10 --port 4711
あるいはVS Codeから操作することもできます。mrdbgがデバイスのソケットを
Debug Adapter Protocol
のポートへブリッジします。
$ mrdbg --host 192.168.0.10 --port 4711 --dap-port 12345
その上で、localhost:12345を指すlaunch.jsonのattach設定から
vscode-rdbg
で接続します。tasks.json/launch.jsonの完全な設定例はmruby-debugの
READMEを参照してください。
このページの内容