Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
"debug.gem" の利用体験・開発体験の向上
Search
Naoto Ono
July 12, 2022
19
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
"debug.gem" の利用体験・開発体験の向上
Naoto Ono
July 12, 2022
More Decks by Naoto Ono
See All by Naoto Ono
VS Code をプロダクトにどう取り込むか
onomax
1
1.1k
Introduction of new features for VS Code debugging
onomax
2
2.5k
Introduction of Tools for providing rich user experience in debugger
onomax
0
26
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
360
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Evolving SEO for Evolving Search Engines
ryanjones
0
220
How to Ace a Technical Interview
jacobian
281
24k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
Documentation Writing (for coders)
carmenintech
77
5.4k
The Spectacular Lies of Maps
axbom
PRO
1
810
HDC tutorial
michielstock
2
710
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Transcript
“debug.gem”の 利用体験・開発効率の向上 Ruby Association Active Report 小野 直人
自己紹介 • 小野 直人(@ono-max) ◦ Software Engineer at 株式会社サイバーエージェント ▪
Developer Productivity 室 • フィーチャーフラグ・A/Bテストプラットフォームの開発 ◦ Google Summer of Code 2021 “Tests for Debugger” ▪ Ruby 3.1 から導入された “debug.gem” のテストフレームワーク作成 ◦ 最近ネズミが家に出ました 🐭
debug.gem • 笹田さん(@ko1)が開発したすごいデバッガ • ブレークポイント設定時の処理速度が速い • VS Code などの IDE
サポート • Ruby 2.7 以上をサポート • ターミナルでの起動例 ◦ rdbg target.rb ◦ rdbg -c -- bin/rails
今回の発表に興味を持ってくれそうな方 はじめに...
普段 VS Code を使ってないんだけど リッチなツールでデバッグしたい
Chrome の検証ツール(DevTools)よく触ってる
そんな方にオススメする今回のテーマ Chrome を使ったデ バッグ!
アジェンダ • デバッガに関するおさらい • Chrome DevToolsを用いたデバッグ機能の開発(利用体験向上) • テストフレームワークの開発(”debug.gem” の開発効率向上) •
得られた成果 今回の発表の 前提知識の確認! ユーザーに嬉しみはない ので内容は薄めです ...
デバッガに関するおさらい
デバッガとは • バグの発見や修正を支援するツール ◦ ある瞬間における変数 ◦ コードが実行される流れ • 基本機能 ◦
ブレークポイント ◦ ステップイン ◦ ステップオーバー ◦ … コードリーディング にも便利!
ブレークポイント 4行目にブレークポ イントをセット プログラムを実行 指定した ブレークポイントで停止!
ステップイン これが ステップイン 関数の内部に入る
ステップオーバー これが ステップオーバー 関数を実行して 次の行へ
バックトレース • 今いる地点までのメソッドの呼び出し履歴 • 詳しくは次のページで
def a b end def b c end def c
end ①メソッド a が 呼ばれる バックトレース
def a b end def b c end def c
end ①メソッド a が 呼ばれる バックトレース a メソッド a が積ま れる
def a b end def b c end def c
end ②メソッドbを 呼ぶ バックトレース a
def a b end def b c end def c
end バックトレース ③メソッド b が 呼ばれる a
def a b end def b c end def c
end バックトレース b ③メソッド b が 呼ばれる a メソッド b が積ま れる
def a b end def b c end def c
end バックトレース b a 現在 過去 今いる地点まで の呼び出し履歴
def a b end def b c end def c
end バックトレース b この行で実行が 停止 a 現在の状態
デモ:デバッガを使ってコードリーディング
class Node attr_accessor :value, :next def initialize val, _next @next
= _next @value = val end end def linked_list list = nil 5.times{|n| node = Node.new n, list list = node } list end linked_list サイズ5の 線形リストを作る
None
Chrome DevToolsを用いた デバッグ機能の開発(利用体験向上)
背景 • VS Code を使わない人向けでリッチなデバッグ体験の提供 • Chrome のみでデバッグができる
目標 • Chrome DevTools でのデバッグを VS Code と同等のものへ • Chrome
DevTools 特有の機能を用いたリッチな開発体験の実現
今回の取り組み • Chrome DevTools 上の UI として提供されている機能のサポート • ユーザー体験をよくする機能開発 •
Chrome DevTools を用いた新しい用途の模索
Chrome DevTools 上で提供されている機能のサポート • 例外が発生した際に実行を中断 • 全てのブレークポイントを起動、停止 • スクリプトをブレークポイントなしで強制実行 •
ターゲットフレームにある変数を表示 • クリックすることでネストされたものを表示
例外発生時に実行を停止 ①例外で停止をク リック 例外発生時に停止 ②プログラムを 実行
スクリプトをブレークポイントなしで強制実行 ブレークポイントを無視 して強制実行 -> デバッグを終了
現在の変数の状態を表示 この時点では “a=2” “a=4”に変化
クリックすることでネストされたものを表示 foo = { "a": [ { "a": 1 },
{ "b": 1 } ], "b": [ { "c": 1 }, { "d": 1 . . . クリックすることで値を 見れる 複雑なハッシュも見た い箇所だけ見ることが できる
ユーザー体験をよくする機能開発 • デバッガ起動時に Chrome DevTools を自動で開く • スニペット機能 • Screen
Cast 画面を閉じる
デバッガ起動時に Chrome DevTools を自動で開く $ rdbg target.rb --open=chrome debug.gemをChrome を用いて起動
Chrome DevTools ですぐに デバッグできる状態に!
スニペット機能 実行結果がChrome コンソールに出力 試したいコード を書く
Chrome DevTools を用いた新しい用途の模索 • pp メソッドを呼び出すと Chrome DevTools のコンソールで出力結果を表示 •
Chrome コンソールに画像を表示 • 配列やハッシュをテーブルとして表示
Chrome コンソールに画像の表示 • 以下のように画像や SVG をコンソール上に表示 • 使い道が見つからなかった
配列やハッシュをテーブルとして表示 • 使いやすさが向上する確信が持てなかった After Before
実現できなかったこと • Chrome コンソールの入力補完機能 • マルチスレッド対応 • コードのカラーリング => Chrome DevTools
が JavaScript に依存した設計が原因
Chrome DevTools と debug.gem の通信 Chrome DevTools debug.gem サーバー クライアント
評価 • Chrome DevTools でのデバッグ体験を VS Code と同等のものへ => 一部 Chrome
DevTools の制約を除いて同等の体験を実現 • Chrome DevTools 特有の機能を用いたリッチな開発体験の実現 => スニペット機能、現在状態の変数の表示など独自機能を提供
テストフレームワークの開発 (debug.gem の開発効率向上)
背景 • 本プロジェクト開始前、テストケースはターミナル用のみ • debug.gem がサポートしている UI ツールとの通信部分のテストが欲しい ◦ Chrome
DevTools ▪ Chrome DevTools Protocol (CDP) ◦ Visual Studio Code ▪ Debugger Adapter Protocol (DAP)
取り組んだこと • 2種類のテストフレームワークを作成 ◦ プロトコルを直接書く低レベルでのテスト ◦ 抽象化した高レベルでのテスト
# Chrome DevTools { id: 13, method: "Debugger.setBreakpointByUrl", params: {
lineNumber: 3, columnNumber: 0, condition: "" ... } # VS Code { seq: 12, command: "setBreakpoints", arguments: { source: { name: "target.rb", path: temp_file_path, sourceReference: 0 }, ... } req_add_breakpoint 3 抽象化 例外発生時に停止 低レベル • API が生のプロトコ ルとなる 高レベル • API が簡潔な メソッドになる
debug.gem クライアント Test framework 値をテスト アーキテクチャ サーバー (別プロセスで起動)
評価 • テストフレームワークがマージされテストができている • 時々 random fail が発生してしまう
得られた成果 • 利用体験の向上 ◦ Chrome でのデバッグができるようになり VS Code を使わないユーザーにも リッチなデバッグ体験を提供
◦ Chrome DevTools への対応をしたデバッガの一つの参考例に • “debug.gem” の開発効率の向上 ◦ UI ツールとの通信部分のテストが可能に
謝辞 本プロジェクトを行うにあたり、開発を助成していただきました Ruby Association、またメ ンターである笹田耕一さんをはじめ多くの方にご協力をいただきました。ありがとうござ いました。 • Geoffrey Litt •
Stan Lo • Andrea Cardaci
引用・参考文献 • Chromium Blog. 「10 Years of Chrome DevTools」 https://blog.chromium.org/2018/09/10-years-of-chrome-devtools.html
(参照2022-06-30) • 渋川よしき.「Real World HTTP 第2版」. 株式会社オライリー・ジャパン . 2021年, 496p • ◯×つくろーどっとコム. 「その1 デバッグの超基本「ステップ実行」」 http://marupeke296.com/DBG_No1_Step.html#:~:text=%E3%82%B9%E3%83%86%E3%83%83%E 3%83%97%E3%82%A4%E3%83%B3%E3%81%AF%E6%9C%80%E3%82%82%E3%82%B9%E3 %83%86%E3%83%83%E3%83%97,%E5%85%A5%E3%82%8B%E3%81%93%E3%81%A8%E3% 81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82 (参照2022-07-09) • Debugging with GDB. 「スタックの検査」 https://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-4.18/gdb_7.html (参照2022-07-09)