18
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【RubyKaigi2023】debug.gem 1.8.0 で Ruby のデバッグをしてみる【VSCode】

Posted at

はじめに

Qiita株式会社でエンジニアをしている @wataru86 です。
Qiita株式会社は RubyKaigi 2023 に Platinum Sponsor として協賛・ブース出展しています!

僕もそのメンバーとして、現地で参加していました。本記事では、2日目の @ono-max さんによるセッション「Introduction of new features for VS Code debugging」で発表された debug.gem v1.8 の機能の概要と、実際に使う方法について簡単に説明します。

また、発表時のスライドは以下に公開されていました。

debug.gem

debug.gem は Ruby3.1 からデフォルトでRubyに同梱されている gem です。ソースコードは以下リポジトリにあります。

debug.gem 自体は以前から存在していますが、 先日公開された 1.8.0 で VSCodeによる Ruby のデバッグがさらに便利になっていました。特に、以下の2つの機能の概要と使い方を紹介します!

  • Trace Inspector
  • Debug Visualizer

Trace Inspector

Trace Inspector は以下のように、「どの行でどのメソッドが呼ばれて〜」という情報が表示される機能です。

image.png

実際に VSCode で試す方法を紹介します。実行環境は以下です。

λ ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-darwin21]
λ rdbg -v
rdbg 1.8.0

VSCodeの拡張機能「VSCode rdbg Ruby Debugger」のインストールが必要です。

適当なディレクトリに .vacode/launch.json を作成し、VSCodeによるデバッグができるようにします。

.vacode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "rdbg",
      "name": "Debug current file with rdbg",
      "request": "launch",
      "script": "${file}",
      "args": [],
      "askParameters": true,
      "useTerminal": true
    }
  ]
}

デバッグを行うファイルを作成します。

sample1.rb
def foo(a, b)
  var1 = "var1"
  var2 = "var2"
  p a, b
end

def bar(c, d)
  foo c * 2, d * 3
end

puts "set breakpoint"
bar 10, 20
puts "set breakpoint"

これで準備が整いました!あとはブレークポイントを設定して、実行するだけです。
puts "set breakpoint" のところにブレークポイントを設定します。行番号の左をクリックすると、赤い点が表示さます。

image.png

ブレークポイントの設定ができたら、緑色の ▶︎ ボタンをクリックします。

image.png

以下のような表示が出てきたら、 Enter キーを押します。

image.png

問題がなければプログラムが実行され、1つ目のブレークポイントで止まります。
左下の TRACE INSPECTOREnable Trace と書かれているとことがあるので、それをクリックします。

image.png

これで Trace Inspector が有効になるので、「続行」ボタンを押して次のブレークポイントまで実行します。

image.png

すると、以下のように TRACE INSPECTOR にトレースが表示されています。

image.png

12行目で bar が呼ばれ、 7行目の bar の定義に進み、さらに 8行目で fooが呼ばれ...という流れが確認できました。

Trace Inspector にはもう一つ便利な機能があります。 TRACE INSPECTOR の「...」から Record And Replay をオンにすると、その機能が使えます。

image.png

先ほどと同様に、2つ目のブレークポイントまですすめると、以下のように表示されます。

image.png

この機能は、各ステップの状態を保存して、そのステップでどの変数がどんな値だったか、メソッドがどの引数で呼ばれているかなどそれぞれ確認ができます!

Debug Visualizer

VSCode には Debug Visualizer という、デバッグ中の値を可視化する機能があります。
debug.gem 及び debugvisualizer.gem にっよって Ruby でもこの機能が使えるようになります。

例として、 デバッグ中の変数に ActiveRecord が入っている場合、それを表として表示できます!

image.png

実際に VSCode 上で使えるようにする手順を紹介します。
今回、ActiveRecord の値を表示するために、sqlitesample.sqlite3 ファイルにデータベースを作成しておく必要があります。sqlite3 コマンド等で以下SQLを投げるなどして、事前にデータを用意しました。

CREATE TABLE users(id text primary key, name text, age integer);
INSERT INTO users VALUES(1, "wataru86", 26);
INSERT INTO users VALUES(2, "ohakutsu", 25);

データの準備ができたら、実際にデバッグしていきます。以下の Ruby ファイルの foo の各状態の中身をデバッグしていきます。

sample2.rb
require "bundler/inline"

gemfile do
  source "https://rubygems.org"
  gem "debugvisualizer"
  gem "nokogiri"
  gem "sqlite3"
  gem "activerecord"
end

require 'nokogiri'
require 'open-uri'
require 'json'
require 'active_record'

# Array
foo = [1, 70, 10, 3, 40, 30]

# Hash
foo = {"Sun": 50, "Mon": 120, "Tue": 80, "Wed": 150, "Thu": 180, "Fri": 220, "Sat": 100}

# Nokogiri
foo = Nokogiri::HTML(URI.open("https://example.com/"))

# ActiveRecord
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: "sample.sqlite3")
class User < ActiveRecord::Base ; end
foo = User.all

foo = 1

こちらも VSCode に拡張機能が必要なので、以下をインストールします。

インストールができたら、コマンドパレットから Debug Visualizer New View を探して実行します

image.png

すると左側に以下のようなタブが開かれます。

image.png

これで準備は完了です。foo に各値を代入している箇所にブレークポイントを用意します。

image.png

緑色の 「▶︎」ボタンで実行します。
Visualizer に foo を入力すると、 foo の値が表示されますが、まだ Array に代入する前なので、  nil です。

image.png

続行を押し、foo の値をもう一度表示すると、以下のように表示されます。x軸が index で、 y軸が要素の値です。

image.png

Extractor Visualizer を変更することで、表示方法を変えることができます。

image.png

image.png

デバッグを続行し、Array 以外も見てみましょう。

Hash

棒グラフや円グラフとして表示できます。

image.png

Nokogiri

木構造が表示され、閉じたり開いたりできます。

image.png

ActiveRecord

表が表示されます。 age で sort もできます。

image.png

さいごに

debug.gem に便利な機能が増えていてとても驚きました!Rubyの VSCode でのデバッグ技術はここ最近で非常に進化していますね。これからもっと便利になると嬉しいです!

昨日も RubyKaigi 2023 1日目のセッションに関する記事を投稿しています!

また、1日目の参加レポートも Qiita Zine に投稿しています。是非ご覧ください。

明日も体力が残っていれば記事を投稿したいです!!

参考文献

18
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
18
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?