LoginSignup
2
6

More than 5 years have passed since last update.

Webアプリのバグ調査方法

Last updated at Posted at 2016-11-19

会社でWebアプリを開発しています。
新人よりバグ

  • 知識によるものもあるのですが、
  • エラーメッセージを理解していない
  • 検討違いのところでデバッグしている

私のバグ調査方法をまとめてみました。

ここでいうバグとは「開発者が期待した通りに動かない」こととします。

開発環境

  • Terasolunaフレームワーク(strutsベース, iBatis, spring)
  • Tomcat8
  • Java8
  • Eclipse4.5
  • HTML, JavaScript, CSS
  • PostgresSQL9.5

1. コードが最新の状態であることを確認

キャッシュが残っていたり、古いコードがデプロイされているなど、そもそもコードが新しくない場合があります。
まずはコードが最新であることを確認しましょう。

サーバ上のファイル(Java, JSP, XML, properties)

  1. プロジェクトのリフレッシュ
  2. サーバの再起動
  3. %TOMCAT_HOME%/work/フォルダ内のclass,jspファイルの更新日時が、最新であることを確認
  4. テスト環境/本番環境の場合は、%TOMCAT_HOME%/webapps/[warファイル名]/WEB-INF/classes

クライアント上のファイル(HTML, JavaScript, CSS)

  1. ブラウザのキャッシュをクリア
    • [Ctrl+F5]を押す(IEの場合クリアされないときがある)
    • ブラウザの設定からキャッシュクリア
    • 対象ファイルのURLに、URLクエリを付与して最新のコードを表示(URLが変わるのでキャッシュしたコードは表示されない)
  2. ブラウザの開発者ツールなどで、対象のファイルが最新であることを確認

2. 再現条件を探す

再現条件が分からないと、デバッガなどを使った調査ができません。
「Aボタンを2回押したときバグが発生する」のような、ざっくりとした条件でよいので、再現条件を探しましょう。

この段階では、「バグが発生しない条件」は探す必要はありません。
たとえば「ブラウザAではバグが起こるけど、ブラウザBでは起こらない」などです。
知っているに越したことはありませんが、知らなくてもエラーメッセージやデバッガを使えば、解決できるバグがほとんどです。
ここでの再現条件は、「エラーメッセージの確認」や「デバッガを使った調査」ができる程度の条件でよいです。

再現しないバグもたまにはありますが、直接メモリを操作しないJavaを使っているので、そうそうないでしょう。

3. エラーメッセージを確認する

エラーメッセージをよく読み、何が原因かを考えましょう。
また、エラーメッセージに「答えとなる原因」が書いてあるときが、意外に多いです。
英語メッセージのため理解しづらいかもしれませんが、斜め読みせずによく読みましょう。

サーバ側のエラーメッセージを確認

以下のいずれかで、エラーメッセージを確認します。

  • Eclipseのコンソールウィンドウ
  • テスト環境/本番環境の場合は、%TOMCAT_HOME%/log/*stdout*.log,%TOMCAT_HOME%/log/*stderr*.log

Exceptionのスタックトレースが出力されていなければ、出力するようにしましょう。
スタックトレースでは、どのメソッドから呼ばれて、ソースの何行目でエラーが発生したという、情報が分かります。
スタックトレースの読み方は、下記サイトが参考になります。
http://www.atmarkit.co.jp/ait/articles/0605/20/news012.html

わんさかエラーが出ている場合、一番最初に出力されたエラーメッセージを確認してください。
そこがエラーメッセージの「元」です。それ以降のエラーメッセージは、エラーが発生したことによる別のエラーメッセージで、確認してもあまり意味はありません。

SQL関係のエラーが発生した場合

  • データベースに接続できていない
    • データベースは起動しているか。OSのサービスなどを確認。
    • ホスト名、ユーザ名、パスワードを間違っていないか?
  • 呼び出すSQL文が存在していない

    • 呼び出すSQL文のID名は、Java側とXML側(SQL外部ファイル)で一致しているか?namespace属性も確認。
    • SQL文を書いた外部ファイルが読み込まれているか。webapps/WEB-INF/sqlMapConfig.xmlを確認。
    • parameter mapでエラー(JavaからSQL側に入力値を渡す部分)
    • parameterClass属性に書いたクラス名は存在しているか
    • <parameter>タグのproperty属性値は、Java側と一致するか?またJava側でpublicのgetterが用意されているか?
    • result mapでエラー(SELECT文の結果をJava側に渡す部分)
    • resultClass属性に書いたクラス名は存在しているか
    • <result>タグのproperty属性値は、Java側と一致するか。またJava側でpublicのsetterが用意されているか?

クライアント側(JavaScript)のエラーメッセージを確認する

ブラウザの開発ツールからコンソールを開いて、エラーメッセージを確認しましょう。
なお、クライアント側のエラーメッセージは、通常スタックトレースではなく「~ is not defined」のような一文なので、サーバ側と比べると分かりづらいです。
(try-catchを使えばスタックトレースを出力できるが、一般的ではない?)

4. デバッガを使って

エラーメッセージを読んでも理解できなかった場合は、デバッガを使ってバグの原因を調査しましょう。

# 参考サイト
http://qiita.com/jkr_2255/items/4b8a8245a48a1df29b3e
http://www.avnet.co.jp/embedded/column/Theme5/04.aspx

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6