1

注:実際には回答を投稿しますが、他の提案は大歓迎です!

コメントが私の目標を疑問視するのを防ぐために、この質問には少し文脈が必要です... :-)

私が働いている場所では、多くのデバッグを使用していますが、ほとんどはEclipseで行われます。優れた設計と分析、および適切な単体テストによってバグの分析が容易になると主張して、デバッグの実践に疑問を呈する人がいることを私は知っています。

ええと、私はJava 1.2(または1.1)が最新バージョンであったときに設計されたレガシーアプリケーションの大規模なコードベース(Java / Swing)に取り組んでおり、コードには多くの問題があり、何年にもわたって取り組んだ後でも、それの10%以上を知っているふりをすることはできません!そして、私たちが持っているJUnitテストは、せいぜいコードのおそらく1%をカバーしています(これはここでの最近の慣習です...)。

したがって、優れたデバッガーを使用して、クラス、クラス内のデータ、提供するデータの種類を使用したソフトウェアの動作などを調べることが重要です。

ただし、ステップバイステップには限界があります。速度が遅くなる可能性があり、内容を見逃す可能性があります。また、paint()メソッドを調べたり、マルチスレッドパーツを使用したりする場合など、実用的でない場合もあります。

そのため、これらの困難なケースでは、いくつかのステートメントをあちこちに散りばめ、System.out.println()どのメソッドがどのパラメーターで、どの順序で呼び出されるかを確認する習慣をつけました。ログを使用できますが、この方法の方が簡単です。問題が解決した後、これらの行を削除します。

その慣行の1つの問題は、コミットする前に、これらの行を削除するためにdiffを精査する必要があることです。もう1つの問題は、PerforceをVCSとして使用することです。これは問題ありませんが、そのようなトレースを追加するには、ファイルを明示的にチェックアウトする(読み取り専用から書き込み可能に状態を変更する)必要があります。遅く(Eclipse P4プラグインを使用)、面倒です。

だから、私の質問は、ソースコード自体を変更せずに、コードのいくつかのポイントにコンテキストトレースを追加することは可能ですか?行が実行されるたびに「私はここにいて、それを見た」をログに記録できるもの。

私は最初にEclipseプラグインを検索し、Cデバッガーの提案のみを見つけ、(SOのコメントで、私は思うが、残念ながら参照を失った)解決策を見つけました。他の誰かに役立ちます。上で述べたように、どんな代替案も取るのが良いです。

4

2 に答える 2

3

Eclipseのプラグインは必要ありません。トレースが必要な行にブレークポイントを追加し、条件付きにします(たとえば、Ctrlキーを押しながら余白のブレークポイントアイコンをダブルクリックするか、BPのBP行を右クリックします)。チェックボックスを選択してオプションを保持することにより、リストしてBreakpoint Properties)を選択します。ConditionalSuspend when 'true'

次に、次のようなものを貼り付けます。

System.out.println("ClassName.methodName: " + parameter);
return false;

コンテキストオートコンプリートが機能し(リマインダー:sysout続いてCtrl +スペースが展開されSystem.out.println()ます)、現在のスレッド名やその他の有用な情報を出力できます。

このreturn false;行は、実際にはこのブレークポイントで停止しないようにEclipseに指示しています。したがって、「条件付き」コードが実行され、Eclipseはコードを実行し続けます。

コードの速度が低下するのではないかと心配していましたが、最近のコンピューターでは、人間のレベルでは認識できません。

注:何らかの理由で、の後にセミコロンを入力するfalseと、Perforceプラグインは現在のファイルをチェックアウトしようとします。もちろん、これはキャンセルできます。そして、あなたが線を貼り付けても、それは反応しません...

于 2012-12-21T12:23:00.417 に答える
1

BTraceを見てください。条件付きデバッグ/トレースコードを記述し、開発中に実行中のJVMにアタッチできます。本番環境では、このコードは単に存在しません。

于 2012-12-21T12:26:42.380 に答える