5

Springとjpa(休止状態による)を使用してWebサイトを構築しました。バグがあり、バグが発生している行を特定する方法がわかりません。

ライブバージョンであるため、IDEでデバッグできません(すべてローカルで正常に実行されます)。

私は次のようなログを持っています:o

rg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)#012#011

at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)#012#011

at com.mycompany.server.rpc.UserService$$EnhancerByCGLIB$$64ed2d4f.createAccount(<generated>)#012#011

at com.mycompany.server.rpc.ServiceRPCImpl.createAccount(ServiceRPCImpl.java:309)

私の問題は3行目です。UserServiceオブジェクトはSpringによって処理されるため、プロキシになり、バグの行がわかりません。

問題を解決する方法を知っていますか?

ありがとう

4

3 に答える 3

3

cglibからjdkプロキシに変更することは可能ですか?(Spring AOPプロキシリファレンス

基本的に、Beanにインターフェースとしてアクセスする場合は、jdkプロキシ(スプリングのデフォルトメカニズム)を使用できるため、基になるオブジェクトはそのまま残り、スタックトレースの行番号にアクセスできます。

于 2010-08-17T16:07:46.397 に答える
0

これを局所的に再現できないことは大きな制約だと思います。JMeterまたは他の負荷テストソフトウェアを使用して同時ユーザーアクセスの負荷をシミュレートし、問題を再現するためにローカル環境またはテストサーバーをセットアップしようとします。これが完了すると、微調整/コンパイル/テストのサイクルが大幅に短くなり、運用サーバーのサービスを中断することを恐れずに実験的な変更を加えることができます。大変な努力のように思えるかもしれませんが、この作業は、このバグだけでなく、将来遭遇する可能性のあるバグにも利益をもたらします。

特にSpringはデフォルトでシングルトンスコープを使用しているため、スレッドのバグである可能性があります。そのことを念頭に置いて、失敗しているサービスのマルチスレッド統合テストの作成を検討してください。負荷テストでバグを再現したら、メインのサービスメソッドを作成してsynchronized同時使用を防ぐことで、スレッドのバグであることを確認できます。バグが消えた場合は、並行性のバグである可能性があります。

バグの行を見つけることに関しては、コードが生成されるため、探す行はありません。最善の方法は、UserServiceに関するアドバイスで使用されているすべてのBeanに防御チェックを追加することです。(たとえば、インジェクションが欠落しているためにnull値をチェックします。)Beanのinit-method属性は、Beanが完全に構築され、必要なすべてのコラボレーターが設定されていることをチェックするのに役立ちます。

于 2010-08-13T12:46:47.650 に答える
0

ローカル環境で問題を再現できない場合は、環境/ネットワーク関連の問題である可能性があります。まず、バグをデバッグするために、テスト環境(ローカルマシンだけでなく、実稼働環境に近い)で問題を再現します。

Fiddlerを使用して、ライブバージョンのネットワーク関連の問題をデバッグすることもできます。

于 2010-08-17T02:28:01.460 に答える