次のような関数があるとします。
public void myStart()
{
for (int i = 0; i<10; i++) myFunction(i);
}
private int myFunction(int a)
{
a = foo(a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
//something gnarly here
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
なんらかの理由でコードが機能しなくなりました。おそらくそれはエラーをスローしている、おそらくそれは間違った値を返している、おそらくそれは無限ループで動かなくなっているでしょう。
最初の年のプログラマーは、最初にコンソール/標準出力に出力します(デバッガーの使用を学ぶ前にHello Worldを出力する方法を学びました)。
たとえば、このコードをデバッグするには、次のようにします。
private int myFunction(int a)
{
print("before foo: a=" + a);
a = foo(a);
print("before bar: a=" + a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
print ("foo step1: a=" + a);
//something gnarly here
print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length());
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
コードを実行すると、大きなコンソール出力が表示され、問題が発生している場所を追跡できます。
もちろん、別の方法として、ブレークポイントを設定し、各ポイントでコードをステップ実行します。
コンソールに出力する主な利点の1つは、開発者がクリックなどの手順を踏むことなく、値の流れを一度に確認できることです。
しかし、不利な点は、コードがこれらのすべての印刷ステートメントで処理され、削除する必要があることです。
(おそらく、特定の値のみをログに出力するようにデバッガーに指示することは可能ですか?ブレークポイントは、実際にコードを変更せずに簡単に追加または削除できます。)
私はまだ主要なデバッグ方法としてコンソール印刷を使用していますが、これが他の何かと比較してどれほど一般的/効果的であるか疑問に思っています。