デバッグ
日本語 | 虫取り |
英語 | debug |
ふりがな | でばっぐ |
フリガナ | デバッグ |
バグを取り除く作業。
バグが発生した場合に、そのバグを取り除くため、特殊な方法で実行し、バグの発生源を突き止めること。
デバッグを行うためには、通常とは別の方法で実行する。この実行そのものを「デバッグ」と言う場合もある。また「デバッグ実行」と言う場合もある。
この特殊な実行時には、「ブレークポイント」を使うことでプログラムを一時停止することができる。一時停止中は、変数やフィールドの中身を見ることができ、さらに値を変更することもできる。また、スタックトレースを見ることもできるため、メソッドがどう呼び出されてきたのかを確認することもできる。
一時停止中には、「ステップイン」「ステップアウト」「ステップオーバー」によって、プログラムを少しずつ進めることができる。
「ステップイン」は、プログラムを一行ずつ進める。メソッドがある場合には、そのメソッドの中へと入る。
「ステップアウト」は、プログラムを一行ずつ進める。ただし、メソッドがある場合にはメソッドの中へは入らず、メソッドを呼んでその後次の行へと進む。
「ステップオーバー」は、現在のメソッド内の処理を終えて、メソッドの呼び出し元へと移る。
これらを使用することでプログラムがどのように流れていくのかを確認することができ、ステートメントの動作確認に使用することができる。
これらの機能を駆使して、バグを取り除くことになる。
デバッグを行うことで、プログラムでは見えない「変数の中身」を見ることができるため、プログラムを睨み付けるよりはデバッグしてしまう方が原因が特定しやすいこともある。「百聞は一見にしかず」である。
ただし、そのデバッグした箇所がそもそもの原因とは異なっている場合には、バグの修正が無駄に終わったり、他のバグを見逃す原因となる場合もあるため、注意が必要である。
デバッグを行う場合、通常はデバッグを行うための開発環境を用いる。
この環境を「デバッガ」と言う。
Javaの標準デバッガはjdbだが、これは非常に使いづらい。
Eclipseにもデバッガが備わっており、こちらは非常に使いやすいため、Eclipseの使用を強く勧める。
Eclipseであれば、行の左側でダブルクリックすることでブレークポイントをセットすることができ、メニューの「実行」-「デバッグ」でデバッグ用の実行を行うことができる。
デバッグには各種のビューを使用する。「デバッグ」ビューで「ステップイン」「ステップアウト」「ステップオーバー」等を行うことができ、スタックトレースを見ることもできる。また、「変数」ビューではローカル変数やフィールドの値を見ることができ、さらに値を変更することもできる。
サーブレットのように、main()メソッドから始まらないプログラムの場合には、そのままではデバッグが行えない。その場合、アプリケーションサーバーごとに用意されたプラグイン等を使用するか、アプリケーションサーバーがJavaプログラムの場合、そのプログラムをデバッグ用に実行することでデバッグを行うことができる。
ちなみに、上記のような方法を取らず、変数やプログラムの流れをprintln()メソッドで出力して、バグを見つける方法も、一応デバッグと言える。
バグを取り除くことが「デバッグ」だが、「デバグ」とは滅多に言わない。
バグが発生した場合に、そのバグを取り除くため、特殊な方法で実行し、バグの発生源を突き止めること。
デバッグを行うためには、通常とは別の方法で実行する。この実行そのものを「デバッグ」と言う場合もある。また「デバッグ実行」と言う場合もある。
この特殊な実行時には、「ブレークポイント」を使うことでプログラムを一時停止することができる。一時停止中は、変数やフィールドの中身を見ることができ、さらに値を変更することもできる。また、スタックトレースを見ることもできるため、メソッドがどう呼び出されてきたのかを確認することもできる。
一時停止中には、「ステップイン」「ステップアウト」「ステップオーバー」によって、プログラムを少しずつ進めることができる。
「ステップイン」は、プログラムを一行ずつ進める。メソッドがある場合には、そのメソッドの中へと入る。
「ステップアウト」は、プログラムを一行ずつ進める。ただし、メソッドがある場合にはメソッドの中へは入らず、メソッドを呼んでその後次の行へと進む。
「ステップオーバー」は、現在のメソッド内の処理を終えて、メソッドの呼び出し元へと移る。
これらを使用することでプログラムがどのように流れていくのかを確認することができ、ステートメントの動作確認に使用することができる。
これらの機能を駆使して、バグを取り除くことになる。
デバッグを行うことで、プログラムでは見えない「変数の中身」を見ることができるため、プログラムを睨み付けるよりはデバッグしてしまう方が原因が特定しやすいこともある。「百聞は一見にしかず」である。
ただし、そのデバッグした箇所がそもそもの原因とは異なっている場合には、バグの修正が無駄に終わったり、他のバグを見逃す原因となる場合もあるため、注意が必要である。
デバッグを行う場合、通常はデバッグを行うための開発環境を用いる。
この環境を「デバッガ」と言う。
Javaの標準デバッガはjdbだが、これは非常に使いづらい。
Eclipseにもデバッガが備わっており、こちらは非常に使いやすいため、Eclipseの使用を強く勧める。
Eclipseであれば、行の左側でダブルクリックすることでブレークポイントをセットすることができ、メニューの「実行」-「デバッグ」でデバッグ用の実行を行うことができる。
デバッグには各種のビューを使用する。「デバッグ」ビューで「ステップイン」「ステップアウト」「ステップオーバー」等を行うことができ、スタックトレースを見ることもできる。また、「変数」ビューではローカル変数やフィールドの値を見ることができ、さらに値を変更することもできる。
サーブレットのように、main()メソッドから始まらないプログラムの場合には、そのままではデバッグが行えない。その場合、アプリケーションサーバーごとに用意されたプラグイン等を使用するか、アプリケーションサーバーがJavaプログラムの場合、そのプログラムをデバッグ用に実行することでデバッグを行うことができる。
ちなみに、上記のような方法を取らず、変数やプログラムの流れをprintln()メソッドで出力して、バグを見つける方法も、一応デバッグと言える。
バグを取り除くことが「デバッグ」だが、「デバグ」とは滅多に言わない。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// バグの例。
int[] ints = new int[]{ 100, 200, 300 }; // ここ。
// ↓これがバグ。「<」が正解。
for( int iF1 = 0; iF1 <= ints.length; ++iF1 )
{
System.out.println( ints[iF1] );
}
// 100
// 200
// 300
// java.lang.ArrayIndexOutOfBoundsException: 3
// at Sample.main(Sample.java:10)
// Exception in thread "main"
// この場合、次のような手順でデバッグするのがいいでしょう。
// 1.
// 「ここ」の行にブレークポイントをセットします。
// 2.
// プログラムを実行して、ブレークポイントで止めます。
// 3.
// 一行ずつステップオーバーしていきます。
// そうすると、ループが4周してしまうことが発見できますので、
// そこから原因を突き止める事ができると思います。
}
}
public class Sample
{
public static void main( String[] args )
{
// バグの例。
int[] ints = new int[]{ 100, 200, 300 }; // ここ。
// ↓これがバグ。「<」が正解。
for( int iF1 = 0; iF1 <= ints.length; ++iF1 )
{
System.out.println( ints[iF1] );
}
// 100
// 200
// 300
// java.lang.ArrayIndexOutOfBoundsException: 3
// at Sample.main(Sample.java:10)
// Exception in thread "main"
// この場合、次のような手順でデバッグするのがいいでしょう。
// 1.
// 「ここ」の行にブレークポイントをセットします。
// 2.
// プログラムを実行して、ブレークポイントで止めます。
// 3.
// 一行ずつステップオーバーしていきます。
// そうすると、ループが4周してしまうことが発見できますので、
// そこから原因を突き止める事ができると思います。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // バグの例。 int[] ints = new int[]{ 100, 200, 300 }; // ここ。 // ↓これがバグ。「<」が正解。 for( int iF1 = 0; iF1 <= ints.length; ++iF1 ) { System.out.println( ints[iF1] ); } // 100 // 200 // 300 // java.lang.ArrayIndexOutOfBoundsException: 3 // at Sample.main(Sample.java:10) // Exception in thread "main" // この場合、次のような手順でデバッグするのがいいでしょう。 // 1. // 「ここ」の行にブレークポイントをセットします。 // 2. // プログラムを実行して、ブレークポイントで止めます。 // 3. // 一行ずつステップオーバーしていきます。 // そうすると、ループが4周してしまうことが発見できますので、 // そこから原因を突き止める事ができると思います。 } }