Slide 1

Slide 1 text

DevTools と デバッグ と 私 2024/05/31 Shinjuku.rb #92 好きなもの紹介LT大会 Koji NAKAMURA (@kozy4324)

Slide 2

Slide 2 text

自己紹介 - Koji NAKAMURA (@kozy4324) - Classi株式会社 - (フロントエンド開発歴の方が長いかもしれない)Railsエンジニア

Slide 3

Slide 3 text

好き - DevTools を使ってデバッグすること  (ソフトウェアの仕組みや機序を動かしながら理解することが割と好き)

Slide 4

Slide 4 text

DevTools の推し機能3選 1. Copy as cURL 2. Block request URL 3. JavaScript デバッグツール

Slide 5

Slide 5 text

1. Copy as cURL API リクエストを繰り返しテストしたい時によく使う

Slide 6

Slide 6 text

2. Block request URL 特定のAPIリクエストがエラー時のフロントエンド挙動を確認したい時に使う

Slide 7

Slide 7 text

3. JavaScript デバッグツール

Slide 8

Slide 8 text

3. JavaScript デバッグツール ①ブレイクポイントで一時停止して、 ②スコープ変数が確認でき、 ③そのコンテキストでスクリプト実行して確認ができる

Slide 9

Slide 9 text

3. JavaScript デバッグツールの推しポイント Call Stackを移動して 確認することもできる

Slide 10

Slide 10 text

DevTools に最適化された人間が思うこと... - Ruby バックエンドも DevTools でデバッグがしたい

Slide 11

Slide 11 text

debug.gem で実現できる - debug.gem - https://github.com/ruby/debug - > You can attach with external debugger frontend with VSCode and Chrome. - Rails 7 includes the debug gem - https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-ge m

Slide 12

Slide 12 text

debug.gem を使う

Slide 13

Slide 13 text

debug.gem を使う ②ブレイクポイントで一時停止されて、 ③コードを実行したり、色々確認できる ①ブレイクポイント設定する、binding.break, binding.b でも可

Slide 14

Slide 14 text

debug.gem から DevTools を起動する (rdbg) open chrome

Slide 15

Slide 15 text

debug.gem から DevTools を起動する (rdbg) open chrome Mac であれば Chrome が起動する 起動しない場合は表示される devtools:// の URL を Chrome で開く

Slide 16

Slide 16 text

debug.gem w/ DevTools

Slide 17

Slide 17 text

debug.gem w/ DevTools JavaScriptの時と全く同じ操作感 Frame移動が超簡単、楽 FrameごとのRuby式の評価も出来る

Slide 18

Slide 18 text

遭遇した悩ましい挙動 🤔 - インスタンス変数を評価すると nil になる - ブロック付きメソッド呼び出しを評価しても nil になる

Slide 19

Slide 19 text

debug.gem をデバッグする - $ bundle open debug - lib/debug/server_cdp.rb#L962 あたりにprint文を仕込む - https://github.com/ruby/debug/blob/v1.9.2/lib/debug/server_cdp.rb#L962 DEBUGGER: [:evaluate, {"id"=>21, "method"=>"Debugger.evaluateOnCallFrame", "params"=>{"callFrameId"=>"e8547272d5f75dfe567b420e26b2a42e", "expression"=>"", "objectGroup"=>"console", "includeCommandLineAPI"=>true, "silent"=>false, "returnByValue"=>false, "generatePreview"=>true}}, 0, "", "console"]

Slide 20

Slide 20 text

debug.gem をデバッグして分かったこと - 評価すべき文字列が空になっている - どうやら DevTools が投げてくる時点で空文字列 - コメントにも書いてあった - https://github.com/ruby/debug/blob/v1.9.2/lib/debug/server_cdp.rb#L1044 - > Chrome doesn't read instance variables

Slide 21

Slide 21 text

こうなったら DevTools もデバッグだ! - https://github.com/ChromeDevTools/devtools-frontend - depot_toolsのインストール - $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git - $ export PATH="$PATH:$(pwd)/depot_tools" - ソースコードの取得 - $ mkdir devtools - $ cd devtools - $ fetch –nohistory devtools-frontend - ビルド - $ cd devtools-frontend - $ gclient sync - $ gn gen out/Default - $ autoninja -C out/Default

Slide 22

Slide 22 text

Google Chrome for Testing の実行 - $ ./third_party/chrome/chrome-mac/Google\ Chrome\ for\ Testing.app/Contents/MacOS/Google\ Chrome\ for\ Testing --disable-infobars --disable-features=MediaRouter --custom-devtools-frontend=file://$(realpath out/Default/gen/front_end) --use-mock-keychain - 起動したブラウザのアドレスバーに、debug.gem が出力する devtools:// のURLを 入力する - 表示した画面上で DevTools を起動する - option + command + I

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

RubyをデバッグしているDevTools 左側のDevToolsをデバッグしているDevTools

Slide 25

Slide 25 text

DevTools in DevTools の完成 - DevTools マニア歓喜 😂 🎉

Slide 26

Slide 26 text

DevTools をデバッグして分かったこと - DevTools 内でエラーが発生していた - > Uncaught SyntaxError: Unexpected character '@' (1:0) - https://github.com/ChromeDevTools/devtools-frontend/blob/be0ed2fb4df509f39b73b84fe20a 94f7af948a24/front_end/panels/console/ConsolePrompt.ts#L378 - 入力文字列は JavaScript として parse されていた - https://github.com/ChromeDevTools/devtools-frontend/blob/be0ed2fb4df509f39b73b84fe20a 94f7af948a24/front_end/entrypoints/formatter_worker/Substitute.ts#L30-L33 - `@` やブロック付きメソッド呼び出しは JavaScript として Syntax Error だったというオチ - SourceMap を使って Transpile された変数名を解決するための置換処理が入っている模様 - ここでエラーになると空文字列にフォールバックされていた - DevTools のコンソールは JavaScript しか評価できない、という解釈を得た

Slide 27

Slide 27 text

ワークアラウンド - eval を使う - eval(‘@articles’) - eval('@articles.map(&:title).join(?,)')

Slide 28

Slide 28 text

終わり - DevTools を使って Ruby をデバッグする話をしようと思っていたら、DevTools を 使って DevTools をデバッグする話になっていたという回 - Ruby のデバッグや DevTools に関するノウハウ・ Tips を知るのが好き - オススメ情報があればぜひ教えてください!