私は通常のJavaアプリケーション、GUIなし、多くの計算と問題が発生したときのメインスレッドのスタックでの最大5回の呼び出しをデバッグしています。基本的に、「データを収集しています」ローカル変数ウォッチで。
したがって、段階的に進む代わりに、「Resume」を押した直後にブレークポイントを追加しようとしました。 「最後のデバッガコマンドが完了するまで待機しています」と表示されます。
誰かが以前にこの問題を抱えていましたか?デバッガを変更することがこれを理解する唯一の方法ですか?
IntelliJ(2017.1.4 Community Edition)では、次のようにして問題を修正しました:
デバッガを再実行します。
IntelliJ 2018.2.4で次のように修正しました。
デバッグのためにすべてのスレッドを実際に中断する必要がある場合、これは役に立ちませんが、「データを収集しています...」および「最後のデバッガーコマンドが完了するまで待機しています」というメッセージが表示されなくなりました。この設定は後続のブレークポイントでも保持されるため、一度変更するだけで済みます。
私は同じ問題のように見えるものに遭遇しました。私の場合、それは「悪い」toString
メソッドを持つブレークポイントスタックトレースのクラス(KafkaStream)でした。 toString
メソッドはブロックするため、デバッガーがハングします。メイン行のコードでtoString
メソッドをテストしましたが、メインスレッドがハングしました(つまり、これはデバッガー固有の問題ではありません)。
これが、ブレークポイントにヒットした私のスレッドのスタックトレースです(私のクラスのブール属性をテストしようとした行)。
Intellijは私の問題を回避する方法を提供します。これにより、デバッガーがクラスをレンダリングする方法をオーバーライドできます。
問題が再発した場合は、スレッドダンプ(IDEの内部または外部)を取得して、スレッドの動作を確認することをお勧めします。
ほとんどの場合、デバッグ中に追加したウォッチが原因です。コード内と同じステートメントが再帰的に実行されることになるwatchステートメントをクリアします。デバッグを行う前に、常に時計を清潔に保ってください。
私にとってうまくいった修正は、メソッドのブレークポイントを削除することでした。それはそれを超高速にしました。