はじめに
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 は以下のように、「どの行でどのメソッドが呼ばれて〜」という情報が表示される機能です。
実際に 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によるデバッグができるようにします。
{
"version": "0.2.0",
"configurations": [
{
"type": "rdbg",
"name": "Debug current file with rdbg",
"request": "launch",
"script": "${file}",
"args": [],
"askParameters": true,
"useTerminal": true
}
]
}
デバッグを行うファイルを作成します。
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"
のところにブレークポイントを設定します。行番号の左をクリックすると、赤い点が表示さます。
ブレークポイントの設定ができたら、緑色の ▶︎ ボタンをクリックします。
以下のような表示が出てきたら、 Enter キーを押します。
問題がなければプログラムが実行され、1つ目のブレークポイントで止まります。
左下の TRACE INSPECTOR
に Enable Trace
と書かれているとことがあるので、それをクリックします。
これで Trace Inspector が有効になるので、「続行」ボタンを押して次のブレークポイントまで実行します。
すると、以下のように TRACE INSPECTOR
にトレースが表示されています。
12行目で bar
が呼ばれ、 7行目の bar
の定義に進み、さらに 8行目で foo
が呼ばれ...という流れが確認できました。
Trace Inspector にはもう一つ便利な機能があります。 TRACE INSPECTOR
の「...」から Record And Replay
をオンにすると、その機能が使えます。
先ほどと同様に、2つ目のブレークポイントまですすめると、以下のように表示されます。
この機能は、各ステップの状態を保存して、そのステップでどの変数がどんな値だったか、メソッドがどの引数で呼ばれているかなどそれぞれ確認ができます!
Debug Visualizer
VSCode には Debug Visualizer という、デバッグ中の値を可視化する機能があります。
debug.gem 及び debugvisualizer.gem にっよって Ruby でもこの機能が使えるようになります。
例として、 デバッグ中の変数に ActiveRecord が入っている場合、それを表として表示できます!
実際に VSCode 上で使えるようにする手順を紹介します。
今回、ActiveRecord の値を表示するために、sqlite
で sample.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
の各状態の中身をデバッグしていきます。
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
を探して実行します
すると左側に以下のようなタブが開かれます。
これで準備は完了です。foo
に各値を代入している箇所にブレークポイントを用意します。
緑色の 「▶︎」ボタンで実行します。
Visualizer に foo
を入力すると、 foo
の値が表示されますが、まだ Array に代入する前なので、 nil です。
続行を押し、foo
の値をもう一度表示すると、以下のように表示されます。x軸が index で、 y軸が要素の値です。
Extractor
Visualizer
を変更することで、表示方法を変えることができます。
デバッグを続行し、Array 以外も見てみましょう。
Hash
棒グラフや円グラフとして表示できます。
Nokogiri
木構造が表示され、閉じたり開いたりできます。
ActiveRecord
表が表示されます。 age
で sort もできます。
さいごに
debug.gem に便利な機能が増えていてとても驚きました!Rubyの VSCode でのデバッグ技術はここ最近で非常に進化していますね。これからもっと便利になると嬉しいです!
昨日も RubyKaigi 2023 1日目のセッションに関する記事を投稿しています!
また、1日目の参加レポートも Qiita Zine に投稿しています。是非ご覧ください。
明日も体力が残っていれば記事を投稿したいです!!