Google Chrome版Firebug:デベロッパーツール取扱説明書

第2回JavaScriptのデバッグとチューニング

こんにちは、太田です。前回に引き続いてGoogle Chromeのデベロッパーツールの使い方を紹介しつつ、今回は特にJavaScriptのデバッグ方法について解説していきます。

デベロッパーツールのショートカット

まずはデベロッパーツールのショートカットキーの一覧です。

 Windows / LinuxMac
起動
デベロッパーツールCtrl Shift IOption Command I
JavaScriptコンソールCtrl Shift JOption Command J
パネル操作
右隣のパネルへ移動Ctrl ]Command ]
左隣のパネルへ移動Ctrl [Command [
コンソールの開閉EscEsc
検索ボックスにフォーカスCtrl FCommand F
次の検索結果Ctrl GCommand G
前の検索結果Ctrl Shift GShift Command G
コンソールの操作
次の補完候補TabTab
前の補完候補Shift TabShift Tab
補完の決定RightRight
ひとつ前のコマンド(複数行の場合1行上に)UpUp
次のコマンド(複数行の場合1行下に)DownDown
ひとつ前のコマンドcontrol P
次のコマンドcontrol N
コンソールでの改行(Macのみ)option Return
コンソールのログを消去Ctrl LCommand K もしくは
control L
コマンドを実行EnterReturn
Elementパネルの操作
(見た目での)上の要素UpUp
(見た目での)下の要素DownDown
子要素の展開RightRight
子要素の格納LeftLeft
属性の編集EnterReturn
スタイル
ルールの編集ダブルクリックダブルクリック
次のプロパティの編集TabTab
前のプロパティの編集Shift TabShift Tab
新しいプロパティの追加空白部分のダブルクリック空白部分のダブルクリック
値の増減Up/DownUp/Down
10単位での値の増減Shift Up/Shift DownShift Up/Shift Down
10単位での値の増減PageUp/PageDownPageUp/PageDown
100単位での値の増減Shift PageUp/Shift PageDownShift PageUp/Shift PageDown
0.1単位での値の増減Alt Up/Alt DownOption Up/Option Down
ブレーク中のショートカット
次のCall Stackに移動Ctrl .control .
前のCall Stackに移動Ctrl ,control ,
再開F8 もしくは
Ctrl /
F8 もしくは
Command /
ステップオーバーF10 もしくは
Ctrl '
F10 もしくは
Command '
ステップインF11 もしくは
Ctrl ;
F11 もしくは
Command ;
ステップアウトShift F11 もしくは
Ctrl Shift ;
Shift F11 もしくは
Shift Command ;
ブレークポイントの設置・解除行数部分をクリック行数部分をクリック
ブレークポイントの状態を編集行数部分を右クリック行数部分を右クリック

使用頻度が高いのはデベロッパーツールを起動するCtrl+Shift+I(もしくはCtrl+Shift+J)と、コンソールを開閉するESC、コンソールでは補完候補を選択するtabなどが挙げられます。

例えば、長くて間違えやすいencodeURIComponentのスペルは、Ctrl+Shift+Jでデベロッパーツールを起動してコンソールを開き(コンソールが開かなかった場合はESC⁠⁠、eだけ打ってtabキーを2回押せば encodeURIComponent が補完されるので、スペルを簡単にコピーできます。

JavaScriptデバッガの活用

前回はブレークポイントの設置方法を紹介しましたが、もう一歩進んだ条件付きブレークポイントの設置方法を紹介します。

まず、通常のブレークポイントを設置します。

画像

この青くハイライトされた行番号の上で右クリックすると次のようなメニューが表示されます。

画像

ここで、Edit breakpoint…を選択すると、次のようにブレークするかどうかの条件を入力できるようになります(もしくは、ブレークポイントを設定していない行番号上で右クリックして、Add Conditional Breakpoint…を選択しても同様の入力ボックスが現れます⁠⁠。

画像

次のように真偽値を返す条件式(実際には暗黙的に真偽値に変換されるので真偽値でなくともよい)を記述し、真と評価されるときのみブレークさせることができます。

画像

なお、JavaScriptでは,(カンマ)演算子で複数の式を繋げることもできるので、次のように記述すると、

i === 0 && console.log(x), false

iが0の時にconsole.logでxを出力させるが、条件式としては常にfalseを返すのでブレークはしない(厳密にはconsole.logは値を返さないのでundefined扱いであり、 falseの部分は省略してもブレークしません)といったことが可能です。これによってソースコードには直接手を入れることなくデバッグ用のコードを実行することが可能になります。

なお、このテクニックはFirebugでも利用できますFirebugで元のJavaScriptのコードに手を入れずにdebug用のconsole出力を入れる方法 - 文殊堂⁠。

consoleのメソッド

クロスブラウザJavaScript入門第2回でも取り上げましたが、各ブラウザはデバッグ用のconsoleメソッドを幾つか備えています。

以下はそのサンプルコードです。

console.log(1.1, 1.2, 'a', Math.PI, 'http://gihyo.jp/', '引数はいくつでも可');
console.log('%i', Math.PI);
console.log('%d', Math.PI);
console.log('%f', Math.PI);
console.log('%s', 'abc');
console.log('%o', 'aaaaaa');
console.log('%o', 'http://gihyo.jp/');
console.warn('黄色の三角マーク付き(右下にも出る)');
console.error('赤の罰点マーク付き(右下にも出る)');
console.info(5);
console.debug(6);
console.assert(3+3 === 6, '正解');
console.assert(3+3 === 7, '間違い!(falseのときのみ出力される)');
for (var i = 0;i < 7;i++){
  console.count(3);// 同じ値の場合まとめられるはずだが…
}
for (var i = 0;i < 7;i++){
  console.log(4);// logがcount相当になっている
}
console.dir(document);
console.dirxml(document);
console.group('g');
console.log(1,2,3);
console.log(1,2,3);
console.groupEnd('g');
console.groupCollapsed('g2');
console.log(1,2,3);
console.log(1,2,3);
console.groupEnd('g2');
console.time('time');
(function busy_loop(){
  var start = +new Date();
  while(new Date - start < 100);
})();
console.timeEnd('time');
(function trace(){
  console.trace(9);
})();

(あらかじめコンソールを開いておいてください)

画像

プロファイリング

プロファイリング機能では、JavaScriptの処理時間を記録し、分析することができます。

画像

profileタブを選択し、左下の黒丸のアイコンをクリックすると黒丸が赤丸に変わり、プロファイリングが開始されます。一度開始するとリロードしてもプロファイリング状態は継続し、赤丸のアイコンをクリックするとプロファイリングが終了してレポートが表示されます。

プロファイリングはconsole.profile/profileEndメソッドから操作することも可能です。解析したい範囲を絞ってプロファイリングできるので、console.profileを使用したほうが扱いやすい面があります。

console.profile('profile');
(function busy_loop(){
  var start = +new Date(), i = 0;
  while(new Date - start < 100)i++;
  console.log(i);
})();
console.profileEnd('profile');

console.profile('profile2');
(function busy_loop2(){
  var start = Date.now(), i = 0;
  while(Date.now() - start < 100)i++;
  console.log(i);
})();
console.profileEnd('profile2');
画像

ただし、プロファイリング機能はメソッド一つ一つの分析をするような細かいチェックをする機能ではなく、全体の中からボトルネックを特定する際に効果を発揮する機能です。細かい部分では前述のconsole.time/console.timeEndなどで個別に計測したほうがよいかもしれません。

まとめ

今回はJavaScriptのデバッグ方法を中心にデベロッパーツールの使い方を解説しました。次回はTimelineパネル、Auditsパネルを使った総合的なデバッグ・チューニングについて解説する予定です。

おすすめ記事

記事・ニュース一覧