web-dev-qa-db-ja.com

Javaデバッガをprintlnよりも使用する利点は何ですか?

私は常にSystem.out.println(...)を使用してコードをデバッグします。どの場合にEclipseを使用しますかJavaデバッガ?私はそれを使用する必要がなく、小さなバグシンボルがまだ少し不思議です。デバッガが私を助けることができるケースがありますか? printlnで解決しませんか?

3
Puckl

すべての場合...

確かに、Java IDEについては100%確信がありません(Java IDEと一致しない修正があれば歓迎します)。VisualStudioを使用しているためです。) C#/ F#を超えていますが、監視リストに変数を追加し、条件付きブレークを使用すると、println ...

  • 追加情報を取得するために再構築する必要はありません(プロセス/デバッグセッションを再起動する必要すらありません)
  • 別のマシンのプロセスをリモートでデバッグできます
  • 実行中に現在の実行を移動できます(現在の行を示す矢印をドラッグ)
  • 重要だと思うかどうかに基づいて、コードにステップイン/コードから/ステップオーバー

そして、地獄、私はデバッガーでさえすばらしくありません、しかしそれはまだ光年コンソールのデバッグまたはログを掘り下げる前です。

8
Steven Evers

Printlnデバッグの問題は、println自体に問題があることです。

printlnを使用してデバッグしているときは、コードを変更する必要があります。これは、デバッグを開始する前にバグがどこにあるかをすでに知っているか、少なくともかなり良いアイデアを持っている必要があることを意味します。そして、もしあなたがすでにそれを知っているなら、おそらく少なくともデバッグする必要はないでしょう。(少なくとも)IMEのデバッグの理由は、バグを修正する方法を理解するのではなく、バグの場所を見つけることです。バグを突き止めると、通常は解決策がコンテキストから明白になります。 (もちろん、常にというわけではありませんが、通常はです。)

Println診断で有用な情報が得られない、または十分の情報が得られない場合は、プログラムを閉じて、コードを変更し、再コンパイルして、元に戻す必要があります。バグを再現するのに要したところまで。

バグの発見と修正が完了したら、printlnステートメントを削除するためにコードを再度変更する必要があります。 (お見逃しなく、デバッグ出力を残したまま製品を出荷してください!)

対話型デバッガにはこれらの問題はありません。何を探しているのかを事前に知る必要はありません。スコープ内であればいつでも任意の変数の値を調べることができます。デバッガーはプログラムの外部にあるため、コードを変更する必要はありません。そのため、デバッグを停止してコードを変更し、再コンパイルして新しいものを確認する必要はありません。

手動でインストルメントする(そしてインストルメントを外す)代わりに、コードを外部から検査するという原則だけが、インタラクティブデバッガーが最近のプログラマーの間で好まれるデバッグ方法となっている理由です。

8
Mason Wheeler

デバッガーがprintステートメントを介して得ることができなかったという情報は実際にはありませんbut ...

非常に高速で柔軟性があります。 コードの実行中にコードが何をしているかを自由に見ることができるときに得られる力を言葉で説明することはできません

概して、デバッガを使用すると、通常、デバッグプロセスが10倍高速になると推測します。 1つの印刷ステートメントが次の場所に関する情報を提供するとき(つまり、別の印刷ステートメントを追加する場所)とその新しい印刷ステートメントの出力が表示されるときの間に長いビルドまたはデプロイメントがある場合は、おそらく100回です。デバッガーでは、必要なのはシングルクリック、おそらく0.5秒です。完全な再構築とアプリサーバーへのデプロイを行う必要がある場合、30分かかる可能性があります。

6

私の経験では、Eclipseデバッガー(または、任意の段階的なデバッガー)は、printlnステートメントよりもはるかに役立ちます。

  • 小さな問題である可能性があるため、何度も再コンパイルする必要はありません(これは小さなプロジェクトでは小さな問題のように見えるかもしれませんが、大きなプロジェクトから非常に大きなプロジェクトへと急速にエスカレートできます)。
  • 多くの場合、これらは変数のデバッガー時の変更を可能にしますが、これも便利な場合があります。

(これらは私が見つけた最も基本的な利点です)

ただし、デバッガーは必ずしもそうではありません。

  • ステップバイステップのデバッガーでマルチスレッドプログラムをデバッグすることは、まさに地獄です。最初の書き込みステップでは、通常、バイト単位のデバッグフラグを備えたロギングシステムを使用します(グローバルデバッグ、モジュール1ヘビーデバッグ、モジュール2ヘビーデバッグなど)。これまでのところ、多くのことが節約できました
  • リアルタイムキャラクターがアルゴリズムに不可欠なリアルタイムプログラムのデバッグ(私が念頭に置いているのは、顔をスムーズに動かす必要がある個人用バージョンの顔検出でした。カップルごとにフレームを取得するだけでは問題ありませんでした。デバッグのために数秒-これはビデオ入力を取得することで解決できることを認め、例を示します)

つまり、小さくて使いやすいプロジェクトでは、デバッガが一番の友です。大規模なプロジェクト(多くの人と一緒に作業することが多い)の場合、大規模な書き込み時間のロギングは、さらに大きな味方です。または少なくとも私のもの。

4
Doness

最初にググったほうがいい。 Eclipseのデバッガーには、定義する必要のない多くの関数がすでに含まれています。それ以外の場合、System.out.println()ステートメントは単純な小さなプロジェクトでは役立つかもしれませんが、多くのメンバーが作業しているプロジェクトや多数のファイルがあるプロジェクトでは、これらのステートメントを追加し続けることができません。ブレークポイントがあるのは良いことです。
this をご覧になることをお勧めします

2
Vaibhav Agarwal

デバッガが必要なことはほとんどわかりませんが、必要なときに本当に必要です。

厄介なケースの1つは、printlnを使用してオブジェクトを出力し、「null」を出力する場合です。年齢を問わずコードを見つめた後、その時点でオブジェクトcannotがnullであることを確信しています。それでも、それがprintlnが言うことです。これは時間を浪費する可能性があります。

デバッガーでは、オブジェクトがnullではないことがすぐにわかります。ただし、toString()メソッドは、そのオブジェクトの一部のフィールドの値を出力するようにオーバーライドされています。もちろん、このフィールドの値はnullです。

デバッガーを使用すると、printlnを使用するよりも幅広い質問をすばやく検索できます。しかし、多くの単純な状況では、printlnで十分です。十分でない場合は、時間を無駄にしないでください。

1
DNA