2012-02-26 9 views
1

私が構築しているプログラムは、ユーザーのシステムのいくつかのポイントでフリーズしているようです。私が非常に同じ手順をテストするとき、私は問題を見ません。 Javaはプラットフォームに依存しないVMであると考えられていますが、私が使用しているシステム(私はLinux上ではMac上のユーザ)と関係があります。Java - Line by line 'デバッグレポート'

ユーザーのシステムにアクセスできないため、デバッグの意味が分かりません。問題がどこにあるのかをテストするために、プログラムの進捗状況をファイルに書き留め、問題が発生したときにそのファイルを私に送ってもらうことを考えていました。したがって、私の質問:

プログラムの行ごとの実行をファイルに書き込むことができる何らかの種類のライブラリがありますか?理想的には、特定の変数の値も含まれます。

編集:私はLoggerに慣れていますが、答えが1つのように、多くのログステートメントを書く必要があります。これを自動化する方法はありますか?たぶん一行一行は過剰ですが、それぞれのメソッドの入力/終了を記録するようなものは間違いなく機能します。

ありがとうございます!

+1

Javaのログ機能について調べましたか?これはこれのために作られた問題の仕立て屋のようです。チュートリアル:[Logging Tutorial](http://docs.oracle.com/javase/6/docs/technotes/guides/logging/index.html)を参照してください。 –

+0

Loggerの基本はよく知っていますが、すべての行でLogger.logを書きたいとは思わない。私は私が必要とするこの「書き込み各行」機能をグーグルで試しましたが、役に立たない結果は見つかりませんでした。 Loggerがこれを行うことができるかどうかは誰でも知っていますか? – tb189

+0

ここで他のところで指摘したように、行単位のファイルは膨大で、ほとんど役に立たないデータを含んでいます。私はあなたのスマートな賭けが、あなたが最初に関与している疑いがあるキー領域を記録することによって問題を切り離そうとすることだと思います。断続的な「凍結」は、私にとって、すぐにスレッドの問題を考えるようになります。ああ、これは偶然、スイングGUIですか? –

答えて

3

これはあるかもしれませんの良いユースケース。具体的には、JavaのAspectJ libraryがニーズに合っているかもしれません(他にもありますが、これは私が最もよく知っているものです)。これらのメソッドのコードを変更することなく、トレースするメソッドに自動的にメソッド入力/終了ログメッセージを挿入するロギングの側面を定義することができます。アスペクトは、アプリケーションをビルドするたびに(たとえば、問題を解決するまでこのユーザーのためだけに含めるなど)、必要に応じて含めることも除外することもできます。次のような

何かが良いスタートかもしれません:

aspect LogAllMethods { 
    Log log = new Log(); // pseudocode -- replace with whatever logging mechanism you like 

    before(): call(public * com.mycompany.*.*(..)) { 
    log.log("Entered method: " + thisJoinPoint); 
    } 

    after(): call(public * com.mycomapny.*.*(..)) { 
    log.log("Leaving method: " + thisJoinPoint); 
    } 
} 

これは基本的に(、パッケージcom.mycompany内の任意のパブリックメソッドの呼び出しの前と後の入口/出口とメソッドの名前をログに記録、と言っていますthisJoinPointは、アスペクトが適用されているプログラムの実行中のポイントを参照するAspectJの特別な変数です)。 AspectJのドキュメンテーションには、アスペクトを定義するための良いチュートリアルや例、アスペクトの使い方、アプリケーションにアスペクトを導入する方法の説明があります。

あなたの状況やAspectJの利用率が低すぎるかもしれませんが、コード内のすべてのメソッドにロギングコールを追加することなく、きめ細かなデバッグを行うことができます。

+0

プログラムの全体的なシフトが、この問題に対処するための新しい方法です – tb189

0

通常、必要なデバッグ情報はログファイルに含まれます。 Javaのようなログフレームワークは、Logging APIで、プログラムの実行時に生成されるメッセージの重大度を設定できます。言い換えると、通常は重大なエラーのみを報告することができますが、詳細情報が必要な場合はデバッグ出力を選択的に有効にすることができます。

しかし、ロギングフレームワークでは通常、何をログに書き込むかをプログラマに明示する必要があります。それは単にすべてを(それはあまりにも多くのデータになります!)と記録するだけではありません。

0

あなたのアプリケーションにログインしているように思えます。詳細については、​​のウィキペディアの記事を参照してください。

より一般的なログフレームワークの一部、上記の資料に記載の全て、以下のとおりです。