2010-12-29 16 views
0

実行時に特定のメソッドのトレースを設定できるライブラリについて聞いたことがありますか?system.out.printlnを置き換えるJavaランタイムトレースライブラリ

System.out.printlnのロットを追加して(再コンパイルして再デプロイしなくてはならない)代わりに、選択したメソッドの呼び出しごとに行を印刷するという魔法のことをしたいと思いますコードを変更することなくこれは再コンパイルせずに動作するので、ある種のJVMエージェント(または非標準JVMが必要になるでしょうか?)アスペクトプログラミングの仕事のように聞こえますか?

典型的なシナリオは、アプリケーションを起動し、トレースされたメソッドを動的に(別のファイルなどで)構成し、選択されたメソッドが名前(および引数)を持つ行と呼ばれるたびにSystem.outまたはいくつかのログファイル)。

もちろん、数十の追加機能を考えることもできますが、この基本セットは素晴らしいツールになります。ところで、私はEclipseインタラクティブなデバッガも使用しているだけでなく、System.outトレース技術ですが、どちらもいくつかの利点があり、時にはEclipseで十分ではありません。

答えて

4

はいあなたが指しているものは、アスペクト指向プログラミングと呼ばれています。これをJavaに提供する典型的なライブラリはAspectJです。ポイントカットと呼ばれるもの、つまりワイルドカードを含むクラスとメソッド名の基本的な正規表現、およびアドバイスと呼ばれる各ポイントカットで実行されるコードを定義します。これは、ロギングやセキュリティチェックなどのクロスカッティングにも役立ちます。

設定によってポイントカットアドバイスをオンまたはオフにすることができます。メソッド呼び出しの前、例外がスローされた後、または例外をスローした後でも、アドバイスを実行することができます。引数も利用できます。

これが機能するには、aspectj Javaエージェントが必要です。

+1

私はこれがアスペクト指向プログラミングの "hello world"の使い方です –

+0

私はmigthを知っているAspectJに行くことに同意しますが、それはすぐに使える解決策ではありません。私は何かを捧げたいと思った。 –

+0

なぜあなたはそれを使用する準備ができていないと思いますか? Aspectクラスを作成し、必要なメソッドの正規表現をいくつか入れ、起動スクリプトにAspectJ javaagentをインクルードするだけです。 – jbx

0

Log4Jは、 "ログレベル"(DEBUG、INFO、WARN、FATAL)に応じてロギングを無効にするのに便利です。

設定ファイルで、ログに表示する最小レベルを指定します。たとえば、INFOレベルの下には何も記録しないでください。voila!

+0

次に、コード全体で 'log4j.something()'を使う必要があります。これは 'System.out.println'を一周することとほぼ同じです。 –

+0

確かに、ロギングステートメントを入れるためにコードを変更する必要があります。これを望まない場合、このソリューションはあなたのニーズに適していません。しかし、 'System.out'を一周するのと同じではありません。コードを変更して再コンパイルすることなく、設定ファイルを使ってログの振る舞いを変更できるからです。 –

1

私の経験では、非常に詳細なトレース(通常はログよりもはるかに詳細です)をデバッグテクニックとして使用すると、ユニットテストと統合テストが不十分であることがわかります。

+0

うーん...私はユニット&統合テストが常に必要であることに同意します。そして、典型的には、これらを構築するのに十分な時間(および結果)がありません。しかし、この種のトレースにどのように適用されますか?私の実生活の例(この種のトレースを適用する場所)は、いくつかのメソッドが何度も実行されていた(例えば、多くのオブジェクトインスタンスの場合など)すべてのものになりますが、しばらくの間、それらをログでフィルタリングしてください(Eclipse Debuggerでは、同様の機能が '条件付きブレークポイント'です)。 –

1

InTraceというツールを使用してこれを行うことができます。

注:InTraceは、私が書いた無料のオープンソースツールです。

0

さらに別の解決策があるように見えます - Bytemanと呼ばれています。自分の言葉では:

Bytemanは、トレースおよびJava プログラムのテストを簡素化するツールです。 Bytemanを使用すると、 アプリケーションに余分なJavaコードを挿入することができます。これは、JVMの起動時にロードされるか、既に起動している の後でさえもです。注入されたコードは、 のデータにアクセスし、 がプライベートであるなどのアプリケーションメソッドを呼び出すことができます。ほとんどどこでもコードを注入することができます。 元のソースコードを事前に準備する必要もなく、 アプリケーションを再コンパイル、再パッケージまたは再デプロイする必要もありません。実際に では、注入されたコードを削除し、 アプリケーションの実行中に別のコードを再インストールすることができます。

0

Jackplayは、探しているツールです。

これを使用すると、コーディングや再デプロイメントなしでメソッドの入力および終了ポイントにログオンできるようになります。

また、メソッド本体を再定義することもできます。コントロールパネルとしてWebベースのUIを提供し、クラスのメソッドのトレースを有効または無効にします。

関連する問題