-
ID:8s9TCa さんの質問

プログラミング“ど”素人の私にJavaScriptデバッグ方法をご伝授ください…!!

JavaScriptが動かないときのデバッグ方法を調べています。
およそ共通する方法としては下記の3つかと思います。
1.ブラウザのデベロッパーツール→コンソールを見る
2.console.logでログを出力
3.ブレイクポイントを設定

基本の基本がわかっていないため、1〜3の点と点が正しく関連付けて理解できてない、「これを調べるため」「これを解決するため」と理解して実行するのではなく、「こうするもんだ」と書いてあったからとりあえずやっている、という状態です。

1.コンソール
→問題が起きている箇所(行番号)と、エラーコードはわかる。
 しかし、実際にどこをどう直したら解決するかまでに至らないときがある。
→またはコンソール上には何のエラーコードもでないが、とにかくうんともすんとも動かない時がある。

2.console.log
→そもそも何を呼び出すために行うのかがわからない。
 コンソールのエラーにでた行にある関数、変数などを記入して、その中身を読みだすのでしょうか?

3.ブレイクポイント
→ブレイクポイントを設定し、実行してみたものの、いろんな参照先を行ったり来たりしているのを見ていても、どこに問題があるのかよくわからない。
 問題がある場所で止まって、エラー表示などが出るのでしょうか?

また、上記の3つの方法は順番に実行すべきなのでしょうか。1で解決でなければ2、2で解決できなければ3、など。
あるいはそれぞれの目的が異なり、別個に行うのでしょうか。それすらもわからない状態です…

みんなの回答 5 件

ID:2NyMHD さんの回答

  1. でエラーが出なくなったら、
  2. で動かないといけないところが動いているかを確かめる。
    console.log( ’test’ ); を動くはずのところに書いてみて、出力されなかったらそこまでがのどこかで処理が途絶えているということになるから、さらに処理を遡って書いてみて、どこから動いてないかを着き止める。
    その時に、変数aの値がxだったら動くはず…みたいな条件があるなら、3.ブレイクポイントを設定して変数aにどういう値が入っているかを確認する。(これは、2.のconsole.logで出力してもいいから、そこで一旦処理を止めて確認したい時だけ3.を使う)
    構文ミスじゃないなら、大体は、ifなどの条件の指定がおかしいか、渡される値が想定した状態になってないか、イベントが発火してないからのどれかだと思うから、if が正しく判定されているかif の中にconsole.logを書いて条件判定が正しいかを見たり、イベントが発火しているかを確認したりすれば直せる。

ID:2NyMHD

「1.」とかを行頭に入れると消されるのか…
適当に脳内保管して。

ID:8s9TCa

ありがとうござます。

スクリプトは上から順に処理されるはずなので、console.logを差し込んで、処理されている=動いている、処理されない=その前のどこかで止まっている、という突き止め方になる、ということのようですね。
基本的なことがわかっていないので、大変感謝です!

ブレイクポイントも操作や意味に詳しくなって、ちゃんと有効活用したいと思っています…

ID:8s9TCa

ためしに、いろんなところに「console.log(’test’);」を入れてみたところ、関数{}の中にエラーがある場合は、関数{}の外であれば、エラーの下の行にconsole.logがあっても出力されるようでした。

ID:2NyMHD

なんか関数の中とか外とか言動が怪しいけど、どこがどういう順番で実行されてるか把握できてる?

ID:2NyMHD

function sample() {
console.log(’test1’);
}
console.log(’test2’);
.
test2 は実行されるけど、test1は、sample(); で関数を実行しないと出力されないよ。

ID:8s9TCa

ありがとうございます。
その関数はある画像にマウスを乗せた時に実行されるように書いていました。そして、その関数の中に間違い記述と「console.log(’test1’);」を記入したところ、「console.log(’test1’);」は実行されませんでした。
この関数{}の外(関数より下)に書いた「console.log(’test2’);」は実行されました。
こういう検証自体が初めてで、それまでconsole.logの意味がわかってなかったので、大きなヒントをいただいたような気がします。コピペをパッチワークしているような未熟者ですが、ゼロからプログラミングできるよう、頑張ります。

ID:g8XkWY さんの回答

3.あちこちのソースに飛ばせない方法

ああ

https://developer.mozilla.org/ja/docs/Tools/Debugger/How_to/Black_box_a_source
ID:2NyMHD

> 現在の Web 開発では jQuery、Ember、Angular のようなライブラリに頼ることが多く、ライブラリを実行する時間の 99% は“正しく働く”と考えても問題ありません。
.
それは無い

ID:8s9TCa

ありがとうございます。
こちらは「3.」ブレイクポイント時に、jQueryなど複数のJSファイルを行ったり来たりしないようにブラックボックス化する、という理解で合っていますでしょうか。

ID:g8XkWY

その通りです。

ID:8s9TCa さんの回答

追記です。1のデベロッパーツール>コンソールについて

例えばChromeのコンソールに下記のような赤字エラーが表記された場合は
---------------------------------------------------------
「Uncaught TypeError: ○○」「aaa.js:18」
---------------------------------------------------------
この18行目を修正すれば解決するということでしょうか。
(クリックするとコードのその行に赤い×印が表示されます)

その下にも何行か「○○」「bbb.js:54」、「○○」「bbb.js:80」のような表記が続いていますが、そちらをクリックすると行の色が変わるのみで、エラー表記はないようです。これらの場所自体は修正しなくてもいいという理解でいいでしょうか。(先の「aaa.js:18」のエラーから影響を受けている部分を教えてくれている?)

ID:8s9TCa

エラーメッセージの原典はここ(MDN)でいいでしょうか。
ttps://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Error

ID:i/eltH さんの回答

明らかに動きそうな部分を残して他は削除する。
動かない部分のコードは別のファイルに対比させておく。

でconsole.log();いれてブラウザで実行してみる。
それでも動かないなら、さらに動きそうな部分を残して削除して~の繰り返しで動いていない場所を特定する。

ID:8s9TCa

ありがとうございます。なるほど、そういう特定方法もあるのですね。

どんどん削除する場合は、例えば変数の元を消したり、関数の途中の行を消すとブラウザの動きは想定通りにならないと思いますが、それは気にせずに「console.log」が動くかだけを気にすれば良い、という感じでしょうか。

ID:i/eltH

どこまでのコードが正しく動いて、想定する結果が正しく出ているかをconsole.logで調べるって感じですわ。

イメージ的にはコード自体を自分の目と頭で二分検索するって言えばいいのか、どこがダメなのか見つけるみたいな。

ID:8s9TCa

質問に書いた3つの中ではconsole.logが何のために行うのか一番理解できていなかったので質問して本当に良かったです。私はconsole.logは医者が聴診器で音を聞いているような、技術者が検査でカナヅチでトントン叩いて回っているような、そんなイメージがわきました。
なにごとも意味や目的を理解して行うのが一番大事なんだ、と気付かされました。

ID:UBU6Gd さんの回答

トピ主は自分でコード書いてないだろ?拾ってきたコピペを組み合わせてるだけで自分の頭で考えてないだろ?それが本質的問題だよ。
コードの一字一句を「理解」しろよ。そして本当に意図通りに実行が進んでいるかを確認するためにツールを使う。

ID:8s9TCa

本当に仰る通りだと思います。ゼロから考えて書く、という経験が不足していると思います。精進します。jQueryから入ったのはいまから考えると亜流でした…

ID:KxRL9K

コメ主の言う通りなんだよな。
自分で書いてれば、
「ここで一旦止めたいな」
「ここでプロパティに何入ってるんだろう」
「この変数どこで値入ってるんだよ」
って自然に思うようになって、デバッグツールはそれを実現するだけの道具でしかないから。

ID:8s9TCa

確かに私はコピペパッチワーカーだったことに気付かされました。
人のコードや過去の仕事のコードを組み合わせて、動かないなーと解読したり。ムダが多いですよね…

最終更新日:2015-08-06 (3,880 views)

関連するトピックス

ページ上部に戻る