- デバッグが出来なくて、バグ修正に時間がかかってしまう人
- バグ修正に時間がかかり、プログラミングが遅い人
- 基本的なデバッグの方法が知りたい人
プログラミングはデバッグが上手に出来るようになると一気に成長できます。
今回はこのデバッグを上達する方法をご紹介していきたいと思います。
プログラムを書いても一回で思い通りの動作をすることはほとんどありません。
そこでデバッグをしてバグが発生している個所を特定し、修正する必要があります。
プログラミングにはデバッグとコンパイルエラーは付きもので、プログラマやSEにとって必須スキルとも言えます。
EclipseやGDBなどのツールを使う場合もあるのですが、今回は基本的なデバッグの方法をご紹介致します。
コンパイルエラーがなかなか修正できないとお悩みの方は、下記の記事を是非読んでみて下さい。

目次
デバッグのコツ
バグが起きる状況を把握
まずは今どのような状況なのかを正確に把握することが大切です。
- 入力した値が正確に表示されない
- データベースに値が入らない
- 送信したはずのデータが受信されない
のようにして、現象を把握しましょう。
「なんだかよく分からないが、思った通りに動かない」
これではダメです。
何が原因で思っているような動作をしないのか、をキチンと突き止めましょう。
現象をはっきり理解出来ていないと、バグの見当もつきませんし、これからの対処が出来ないです。
何処まで処理が進んでいるのかを把握
プログラムが思っている動作をしない場合、何処まで想定通りの動作をして、どこから異常な動作をしているのかを調査しましょう。
先程の、入力した値が正確に表示されない場合
- 入力した値はどこまで正常に渡されているのか
- 変数に正しく入力した値が格納されているか
を調べることが重要です。
入力した値が複数の関数を渡っている場合、どこかの関数で値を不正に変更している可能性があります。
ですので、各関数の終わりなどにデバッグ文を入れ、どの関数まで正しく値が渡されているかを調査しましょう。
問題を分割
デバッグに関わらず、バグ修正、問題発生時に問題の分割はとても重要です。
何が正常で何が異常かをしっかり分けることにより、異常の可能性が高い範囲を狭めていくことが出来るからです。
先程のデータベースに値が入らない場合
- データベースに書き込む処理まで、処理は進んでいるのか
- データベースに書き込む直前まで、書き込みたい値は正常か
- 書き込む時のSQL文を直接打ち込んで値は格納されるのか
などを試す必要があります。
データベースに書き込む処理まで、処理が進んでいない場合や、データベースに書き込む直前で、書き込みたい値が異常の場合、その処理に到達する前にどこかでエラーが発生している可能性があります。
書き込む時のSQL文を直接打ち込んで値は格納されない場合、そもそもそのSQL文が間違っている可能性や、DBの設定が間違っている可能性が高いです。
先程の送信したはずのデータが受信されない場合
- データの送信はしているのか
- 送信しているデータは正しいか
- 他のデータなら受信するのか
を調査する必要があります。
ちゃんと送信はしていない場合や、送信しているデータが正しくない場合、送信している側に問題があるので、送信側の調査を進めます。
他のデータでは正常に受信する場合、送信しているデータや受信側に問題があり、送信側に問題がないことが分かります。
机上デバッグ
コーディングや、バグを見つけて改修した際にはすぐにコンパイルをして実行するのではなく、机上デバッグを行いましょう。
変更して、コンパイル、実行を行い、これで思った通りにバグが直っていなかった場合、再度やり直しとなり時間がかかってしまいます。
ですので、自分の修正した箇所が本当に正しく動作するかどうかを机上でデバッグをしましょう。
私はよく、モニタに表示されたソースコードをペンで追っています😆
机上デバッグに慣れてくると、自分の書いたコードが異常な動作をする場合、すぐに気づくことが出来るのでバグを少なくできるというメリットがあります。



効果的にデバッグ文を入れ方
- 何処まで処理が進んでいるか
- 変数に正しく値が入っているか
などを調べたい場合、デバッグ入れる必要があります。
しかし、無闇にデバッグ文を入れてしまうと、大量のログが表示されてしまい、ログの可読性が下がってしまいます。
デバッグ文を入れる方法のデバッグはデバッグ文を入れたが分かりづらく、再度入れなおしてコンパイルしてまた実行ではとても時間が掛かってしまいます。
必要最低限のデバッグ文でより多くの情報を得られるようにする必要があります。
用が済んだデバッグ文はコメントアウト
1 2 3 |
for(int i=0;i<100;i++) { System.out.println("デバッグ文"); } |
こんな感じでデバッグ文を入れてしまうと、100回もログが表示されてしまいます。
for文内で変数の変化を見たい場合は必要かもしれませんが、
確認出来次第消すなり、コメントアウトをしておく方がいいでしょう。
デバッグ文だけで処理を追えるようにする
1 2 3 4 5 6 7 |
public static int samVal(int data1,int data2) { System.out.println("samVal start data="+data1+",data2="+data2); int sum = 0; sum = data1+data2; System.out.println("sum="+sum); return sum; } |
1 2 |
samVal start data=1,data2=2 sum=3 |
上記の例では、引数で渡した二つの変数を足して返す関数なのですが、
この関数の初めにデバッグ文を入れることにより、
この関数に処理が入ったことと、渡された引数が正しく渡されているかが判断出来ます。
そして、最後にも返り値を表示させることによリ、正しく値が返っているかどうかを確認できます。
そもそも何故デバッグが出来ないのか
そもそもなぜデバッグが苦手な人が多いのでしょうか?
- 経験の少なさなどから何が原因でバグが発生しているか見当が付きにくい
- 現象に再現性がなく、なんとなくエラーが出ている
- 問題点を切り分けられておらず、大丈夫な部分と、怪しい部分の区別が付いていない
などが原因です。
プログラミングの早さは、いかに早く正確なアルゴリズムを考えることが出来るかよりも、ハマってしまったときにいかに早くその状況から脱することが出来るかがカギとなっています。
そのハマってしまった際に早く抜け出すには、デバッグの精度を上げる必要があります。
デバッグを得意にするためには、一つ一つ正しい部分と怪しい部分を分けていき、バグを生んでいる個所を狭めていく必要があります。



最後に
新人の頃や、プログラミングが苦手な人はデバッグが上手くできずなかなかプログラミングが進まないかと思います。
そんな時にこの記事を読んで少しでもデバッグが得意になり、プログラミングが上達していただけたら幸いです。