2009-06-02 3 views
0

私は、各メソッドにエントリと終了時にSystem.out.printlnステートメントが追加されるように、一連のJavaソースファイルを計測する簡単な方法(たとえば、単一のスクリプト/バッチファイルまたは単純なプログラム)を探しています。System.out.printlnステートメントを持つインストゥルメントのJavaソースファイル?

このようなユーティリティは見つかりませんでした。私はこれを必要とする(そして、それはソースファイルではなく.classファイルで作業しなければならない理由は)理由は、ターゲットシステムは、組み込みJavaシステムであるということです。..事前に

おかげで、 PD

答えて

1

おそらくdidnのSystem.outを使用すると、アプリケーションをインストルメントするには非常に恐ろしい方法になるため、多くを見つけることはできません。

パフォーマンス、コードカバレッジなどを分析するために何をしようとしていますか?もしそうなら、いずれかのツールがたくさんあります。

+0

を見てください。 現時点では、デバッガを使用してコードをステップ実行することはできません(システムのデバッグサポートは当分中断されています)ので、印刷物に頼らざるを得ません。私はこれを行うには恐ろしい方法だが、それにもかかわらず私が試してみたいことはよく知っている。 –

+0

この場合、おそらく、AOPのある種の並べ替えを使用して、各メソッド呼び出しでアドバイスを織り交ぜて前後のステートメントを印刷できますか?それが組み込みデバイスのオプションであるかどうかは不明です。 –

+0

System.out.println()ではなくlog4jを調べる必要があります。挿入を自動化するのに役立つことはありませんが、一度それらの行が存在すると、はるかに多くのコントロールを得ることができます。 – PanCrit

6

これはAspect Oriented Programmingのための優れたユースケースです。

+1

.. 'System.out.println'を使用するのではなく、ロギング(log4j) –

0

これまで何もしていない状況で立ち往生したことがあります。私は実際に行って、正しい方法に落としてしまえば、他のすべての行を挿入しました。

(たとえば、例外をスローしたRMI呼び出しが静かに鳴り、呼び出し元のスレッドが無期限にハングしたJVMで作業していたのです!もちろん、デバッガを使用できませんでした。あなただけの助けにはなりませんEVERYWHEREデバッグ出力を挿入し、プログラムを実行している、とにかく??)

ことがわかります。あなたは、出力のページを分析して失われます。代わりに、問題が発生している箇所を括弧で括って手動で出力行を挿入してください。

あなたのスレッドが1行で "消滅"したり、予期しないターンをした場合、その行を最小限の実行可能な部分に分割し、どの部分が失敗しているかを把握し、 。ところで

、別の有用なツール - でも非常に古いJVM上で、あなたが投げることができる任意の時点で「(新しい例外())のprintStackTrace();。」プログラムの流れに影響を与えずにスタックをダンプします。あなたが自分の場所にいることがわかっていて、そこにいかに乗っているのかわからない場合は、これが役に立ちます。

最後に、本当に怠惰になりたい場合は、単一の静的メソッドを使用してすべてのデバッグ出力(System.out.printlnに委任したもの)を実行し、スタックトレースを取得するために2行追加して、 "呼び出し"行/メソッドだけを取得し、debug文の前に出力して、貧しい人のログユーティリティを提供してください。

私は組み込みプラットフォーム上でJavaの古いバージョンをいじっの年から学んだだけでいくつかの手動デバッグトリック。私はキースに同意

0

は、自動的にすべての関数へのロギングを追加するアスペクト指向プログラミングを使用する必要があります。私は次のコードでタイミングを似たようなことを行います:

import org.apache.commons.logging.LogFactory; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 
import org.springframework.util.StopWatch; 

@Aspect 
public class ProfilingAspect { 

    @Around("methodsToBeProfiled()") 
    public Object profile(ProceedingJoinPoint pjp) throws Throwable { 
     StopWatch sw = new StopWatch(pjp.getSignature().getClass().getSimpleName()); 
     try { 
      sw.start(pjp.getSignature().getName()); 
      return pjp.proceed(); 
     } finally { 
      sw.stop(); 
      LogFactory.getLog(pjp.getSignature().getClass()).debug(sw.shortSummary()); 
     } 
    } 

    @Pointcut("execution(public * *.*(..))") 
    public void methodsToBeProfiled(){} 
} 

これはかなり簡単なアスペクトの種類です。主要な部分は、戻り値の型または入力パラメータに関係なく、すべてのパブリッククラスのすべてのパブリッククラスのすべてのパブリックメソッドにこのアスペクトを適用することを宣言するポイントカットアノテーションです。おそらくもっと具体的にしたいと思うでしょう。 @Aroundアノテーションはポイントカットを参照し、関数の周りで実行したいコードの束を指定します。あなたのケースでは、呼び出されている関数のログのみを必要とする場合、@Aroundを@Beforeまたは@AfterReturningに置き換えることができます。アプリケーションのすべてのビルドを行っている場合は、読み込み時間とは対照的に、「コンパイル時間」を目指してください。アプリケーションのランタイム要件を削減します。

0

あなたが探している機能を提供するslf4j用の拡張機能を書いています(System.outの代わりにロガー呼び出しをしていますが、System.outにロガー呼び出しを送るのは簡単です)。最初のものを行くものを見るために、関連する場所でいくつかのより多くのプリントアウトを追加し、カバレッジ情報を取得 -

は、私はトリッキーなバグの第一段階解析を実行しようとしていhttp://www.slf4j.org/extensions.html#javaagent

関連する問題