8
5

More than 1 year has passed since last update.

Rubyの新しいデバッガを試してみる

Posted at

はじめに

Ruby 3.1.0 の目玉機能の1つに新しいデバッガがあります。
私は、このデバッガの2つの特徴に注目しました。
1つは、リモートデバッガ。もう1つは、DAPに対応していることです。

新しいデバッガのインストール

デバッガ自体は、Ruby 3.0 でも使うことができます。

$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]

デバッガをインストールしてみましょう。

$ gem install debug

デバッガのバージョンは、1.3.4です。

$ rdbg -v
rdbg 1.3.4

リモートデバッガ

リモートデバッガは、別のサーバーで動いているデバッガに接続してデバッグできる機能です。
以下のような簡単なプログラムで少し試してみましょう。

target.rb
a = 1
b = 2
c = 3
d = 4
p [a, b, c, d]

リモートデバッガを試してみる

コンソールからデバッガを起動し、別のコンソールからTCP/IPで接続してデバッグの操作をしてみます。

まずは、コンソールからデバッガを起動します。デバッガのコマンドは、 rdbg です。デバッガを実行するときに、リモートでデバッグできるように -O オプションを指定します。また、 --port でポート番号を指定します。

コンソール1
$ rdbg -O --port 12345 target.rb
DEBUGGER: Debugger can attach via TCP/IP (127.0.0.1:12345)
DEBUGGER: wait for debugger connection...

メッセージから、デバッガの接続を待ち受けていることがわかります。

では、別のコンソールからTCP/IPで接続してみましょう。
接続する場合も rdbg コマンドを使います。 -A オプションを指定し、--port オプションで接続先ポートを指定します。

コンソール2
$ rdbg -A --port 12345
[1, 5] in target.rb
=>   1| a = 1
     2| b = 2
     3| c = 3
     4| d = 4
     5| p [a, b, c, d]
=>#0    <main> at target.rb:1
(rdbg:remote)

(rdbg:remote) とプロンプトが表示され、リモートでデバッガが動作されたのがわかります。

また、1つ目のコンソールには、リモートから接続があったメッセージが出力されます。

コンソール1
DEBUGGER: Connected.

いくつか、2つ目のコンソールからdebugの操作をしてみます。

n で1行だけ実行します。

コンソール2
(rdbg:remote) n    # next command
[1, 5] in target.rb
     1| a = 1
=>   2| b = 2
     3| c = 3
     4| d = 4
     5| p [a, b, c, d]
=>#0    <main> at target.rb:2
(rdbg:remote)

変数 a の値を参照してみます。

コンソール2
(rdbg:remote) a
1
(rdbg:remote)

info コマンドを実行してみましょう

コンソール2
(rdbg:remote) info    # command
%self = main
a = 1
b = nil
c = nil
d = nil
(rdbg:remote)

c コマンドで最後まで実行します。

コンソール2
(rdbg:remote) c    # continue command
$

最初のコンソールに接続が切れたことが出力され、デバッガが終了します。
shell:コンソール1
[1, 2, 3, 4]
DEBUGGER: Disconnected.

何が嬉しいのか

例えば、別のサーバーでデバッガを起動して、自分の端末からリモートで接続してデバッグするとか、docker のコンテナでデバッガを起動しておいて、別コンソールから接続するとか、そういったことに利用できそうです。

DAP と NeoVim

DAP は、Debug Adapter Protocol の略です。DAPに対応したエディタ(DAPに対応したクライアントなら何でも良い)であれば、エディタ経由でRubyのデバッガを操作できます。

Visual Studio Code には、VSCode rdbg Ruby Debugger があります。 このプラグインをインストールすれば、 Visual Studio Code で、Rubyのデバッグできるようになるようです。

が、私は NeoVim を使っています。NeoVim から使えないかと思って調べました。 nvim-dap を見つけました。

このプラグイン単体だと使いづらいので、自分でRubyのデバッガ用の設定を追加するプラグイン nvim-dap-ruby を作って公開しました。

nvim-dapnvim-dap-ruby の2つのプラグインを NeoVim に追加すれば、NeoVim が Ruby のデバッガと連携して動作します。

2つのプラグインを追加したあとで、 target.rb を NeoVim で開きます。

nvim target.rb

では、Rubyのデバッガを起動してみましょう。

:lua require('dap').continue()

と入力します。
nvim01.png

続けて Enter キーを押します。選択肢が表示されるので、ここでは、 1 と入力してEnterキーを押します。

nvim02.png

1行目がハイライトされます。
続けて、

:lua require('dap').repl.open()

と入力して、 Enter キーを押します。

nvim03.png

エディタのカーソルを下のバッファに移動してから i キーを押して入力モードにすると dap > というプロンプトが表示されます。
このプロンプトでデバッガを操作することができるようになります。

以下の画像は、 .n と入力して次の行まで処理を進めてから、 a と入力して、変数 a の値を参照しているところです。
nvim04.png

まとめ

Rubyの新しいデバッガの機能のうち、リモートデバッガとDAPを試してみました。
あなたも新しいRubyのデバッガを試してみてはいかがでしょうか?

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5