ブラウザで使うデバッグ技法
(alan.norbauer.com)ブラウザデバッガ活用のヒント
-
高度な条件付きブレークポイント
- 副作用を持つ式を使って、条件付きブレークポイントの機能を拡張
- ログポイント/トレースポイントにより、実行を停止せずにコンソールへログを記録可能
console.countを使って実行回数をカウント- 主要ブラウザはログポイント/トレースポイントをサポート(2020年5月時点)
-
ウォッチウィンドウの活用
- ウォッチウィンドウで
console.logを使用可能 - DOM 変化時に式を実行するため、DOM 変更ブレークポイントを設定してからウォッチ式を追加
- ウォッチウィンドウで
-
コールスタックの追跡
- 関数のコールスタックを追跡して、不一致の呼び出しを見つける
console.traceを条件付きブレークポイントで使い、コールスタックを確認
-
プログラム動作の変更
- ブラウザ内でその場でプログラムの動作を変更可能
- 関数パラメータをオーバーライドして動作を調整
-
簡単なパフォーマンスプロファイリング
- コンソールのタイミング API を使ってコード実行時間を測定
console.time('label')とconsole.timeEnd('label')を使って時間を測定
-
関数アリティの活用
- 特定の数の引数で呼び出されたときだけブレークポイントを有効化
- 関数呼び出し時の引数数の不一致を見つけるために使用
-
時間の活用
- ページ読み込み後、特定の時間が経過してからのみブレークポイントを有効化
- 一定時間はブレークポイントをスキップし、その後だけ有効化
-
CSS の活用
- 計算済み CSS 値に基づいてブレークポイントを有効化
-
偶数回の呼び出しだけ中断
- 偶数回目の実行時にのみブレークポイントを有効化
-
サンプリングによる中断
- 実行のランダムなサンプルに対してのみブレークポイントを有効化
-
特定の行で中断しない
- "Never Pause Here" オプションを使って、特定の行で中断しないよう設定
-
自動インスタンス ID 付与
- クラスインスタンスごとに一意の ID を自動割り当て
-
プログラム的なトグル
- グローバルなブール値を使って、条件付きブレークポイントをプログラム的に切り替え
-
monitor()によるクラス呼び出し- クラスメソッド呼び出しの追跡のために Chrome の
monitorコマンドを使用
- クラスメソッド呼び出しの追跡のために Chrome の
-
関数呼び出しとデバッグ
- コンソールで
debuggerを呼び出した後、関数を呼んでデバッグ
- コンソールで
-
URL 変更時に実行を中断
- シングルページアプリケーションで URL が変更される前に実行を中断
-
プロパティ読み取りのデバッグ
- オブジェクトのプロパティが読み取られるたびにブレークポイントを有効化
-
copy()の使用copy()コンソール API を使って、ブラウザから直接クリップボードへ情報をコピー
-
HTML/CSS デバッグ
- JS コンソールを使って HTML/CSS の問題を診断
- JS 無効化状態で DOM を検査
- 条件付きで現れる DOM 要素を検査
- DOM スナップショットを記録
- フォーカスされた要素を監視
- 太字フォントの要素を探す
- 現在選択されている要素を参照
- イベントを監視
GN⁺の意見
この記事で最も重要なのは、ブラウザのデバッガを使って、開発者がコードをより効率的にデバッグし、問題を解決できるさまざまな技法とヒントを提供している点だ。こうした情報はソフトウェア開発者にとって非常に有用であり、特に複雑なバグの追跡やパフォーマンス問題の解決で時間を節約できるため興味深い。
1件のコメント
Hacker Newsの意見
ブラウザ内蔵デバッグツールの進化
debugger;文の活用debugger;文を使うことは、Chromeデバッガの再帰的なスタックに打ち勝つための唯一の方法だ。NodeJSバックエンドのデバッグの難しさ
pdb.set_trace()/IEx.pry()をよく使っている。console.logデバッグに戻らざるを得ず、原始的に感じられた。Werkzeugの推薦
IIFEのローカル変数にアクセスする方法
UI文字列を使ったデバッグ方法
debugger;文を配置する。条件付きブレークポイントを使ったデバッグ
{configOption: true}を{get configOption() { debugger; return true; }}に変換する方法についての質問。Chrome専用機能の「Monitor Events for Element」
queryObjectsAPIの不在queryObjectsAPI への言及。queryObjects(Function)を使えば、ヒープ上にあるすべての関数の一覧を取得できる。監視変数の使いづらさ