debug.gem、VS Code Debug Visualizer を使ってデバッグ中のオブジェクトをビジュアライズしてみる
概要
VS Code Debug Visualizer という VS Code のエクステンションをご存知でしょうか。デバッグ中のオブジェクトを以下のようにビジュアライズしてくれるものです。
VS Code Debug Visualizer ではこれまで Ruby のサポートはされていませんでしたが、最新バージョン(本稿執筆時点ではバージョン2.4)より debug.gem を用いてのビジュアライズが可能になりました。
本稿ではそれらの実際の使い方についてお話ししていきます。
対象読者
本記事では VScode を用いた debug.gem の簡単な利用方法について理解していて、既にそれらのセットアップが完了している方を想定しています。 VScode を用いた debug.gem の使い方やセットアップ方法については以下のリンクなどをご覧ください。
事前準備
事前準備として VS Code Debug Visualizer のエクステンションをインストールする必要があります。(本来であれば debugvisualizer.gem
も gem
コマンドなどで併せてインストールする必要があるのですが、今回は簡単の為に bundler/inline
を用いてインストールしたいと思います。 gem
コマンドを使ったやり方についてはこちらをご参照ください。)
以下のエクステンションをインストールしてください。
簡単な Ruby プログラムを用いてオブジェクトのビジュアライズをしてみる
では、本題であるオブジェクトのビジュアライズをしていきます。今回は以下のプログラムをビジュアライズしてみましょう。
require "bundler/inline"
gemfile do
source "https://rubygems.org"
gem "debugvisualizer"
gem 'nokogiri'
end
require 'nokogiri'
require 'open-uri'
require 'json'
# Array
foo = [1,70,10,3,40,30]
# Hash
foo = {"2020年6月": 120, "2020年7月": 80, "2020年8月": 150, "2020年9月": 180, "2020年10月": 220, "2020年11月": 100, "2020年12月": 50, "2021年1月": 300}
# Nokogiri
foo = Nokogiri::HTML(URI.open("https://example.com/"))
# 要素数が2つ及びそれぞれの要素が String の Array
foo = [JSON.generate({orange:1, apple:2, banana:3}), JSON.generate({orange:2, apple:5, banana:3})]
foo = 1
このプログラムをデバッグしてみます。ブレークポイントを foo = [1,70,10, ...
という配列 が定義されている行にセットしてデバッガーを起動してみましょう。以下のような画面になります。
デバッガーを起動したら VS Code のコマンドパレットを開きます。コマンドパレットのショートカットキーは「F1」キーあるいは「Command + Shift + P」(Mac)あるいは「Ctrl + Shitf + P」(Windows/Linux)です。
表示された候補の中から「Debug Visualizer: New View」を探して選択します。
選択後少し待つと Debug Visualizer と言うタブが開きます。これがオブジェクトをビジュアライズするビューになります。
このビューに注目すると上の方に入力欄があります。ここにビジュアライズしたいオブジェクトの式を入力します。今回は、変数 foo
を入力してみましょう。
Step Over あるいは Step Into でプログラムを進めてみてください。すると以下のように Debug Visualizer のビューにグラフが表示されました。
変数 foo
には現在ランダムに選ばれた要素で成り立つ配列が代入されていて、その配列のそれぞれの要素のインデックスをX軸、値をY軸としてグラフが表示されています。
他にも色々な表示方法があるので試してみましょう。入力欄の左にある小さい矢印をクリックしてみてください。
Extractor
という文字の上にあるボタンをクリックしてみるといくつか候補が表示されます。好きなものをクリックしてみてください。
例えば「Array As Graph」を選んでみると以下のようにグラフが表示されます。
さらにプログラムを Step Over などで進めてみると表示が変わります。Hash オブジェクトをビジュアライズすると以下のような棒グラフが表示されます。
Nokogiri::HTML オブジェクトをビジュアライズすると以下のようなツリービューが表示されます。
要素数が2つ及びそれぞれの要素が String の Array オブジェクトをビジュアライズするとそれぞれの要素を比較した Diff が表示されます。
おまけ
Rails アプリケーションをデバッグしている際は ActiveRecord オブジェクト(以下の画像では Computer
クラスが ActiveRecord モデルです)をテーブルで見ることができます。
REXML オブジェクトをツリービューで表示することもできます。
XML ファイルのコードは https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85) より引用
最後に
RubyKaigi 2022 で「Object Inspector」というオブジェクトをビジュアライズしたものについてお話しした際は Twitter などでありがたいフィードバックを多くいただきました。実は本稿で紹介したものが「Object Inspector」の辿り着いた先となっています。本当はこちらの機能をもっと早く出したかったのですが、debug.gem の VS Code エクステンションに直接実装するか、あるいは独立してエクステンションを作るか、などのユーザーにどのように使ってもらうかと言う議論のところでリリースまで時間がかかってしまいました...
この機能が流行ったら debug.gem 側に直接取り込むのも検討しているのでぜひ使ってみて貰えると嬉しいです。
謝辞
この記事を始め、多くのフィードバックを笹田さん(@ko1)さんより頂きました。本当にありがとうございました。
また、VS Code Debug Visualizer という素晴らしいツールを開発された Henning さん(@hediet)のおかげで今回の取り組みを実現することが出来ました。ありがとうございました。
Discussion