2

これは私の状況です:

  • 私は、Java1.7で実行されている、移動が非常に簡単ではない、多くのインターフェース、深い継承ツリー、多くのスレッドなどの大規模なコードベースを研究しています。
  • どこかにブレークポイントを設定しましたが、このオブジェクトはどこかで生成されたスレッドで実行されています。その場所を見つける必要があります。
  • .run()と.start()のヒットが多すぎて個別に検索できません(クラス/継承が多いため、クラスで絞り込むのも困難です(コードベースはまだわかりません))。

だから私の質問は、スレッドをブレークポイント(intelliJ、しかし私もEclipseを使用することができます)で停止させて、それがどこで開始されたかを見つける方法はありますか?

ありがとう

4

4 に答える 4

1

たぶん、ブレークポイントをに入れることができますThread.start()

ブレークポイントの複数の呼び出しを回避するには、たとえばグローバルブールフラグをチェックするなど、条件付きロジックでブレークポイントを配置することが理にかなっています。たとえば、あるイベントの直前にコードが呼び出され、イベントが発生したときにグローバルフラグをtrueに設定したと思われます。

于 2013-03-27T10:58:04.460 に答える
0

オブジェクト内のコードを壊すと、それがどのスレッドであるかがわかり、その呼び出しスタックから、Runnable探しているスレッドがわかります。私はあなたがすでにここまで到達していて、このスレッド/ランナブルへのすべての参照を見つけるのに十分ではないと仮定しています。その場合java.lang.Thread、instanceof / typeチェックを実行し、run()そこにブレークポイントを設定するラッパークラスを作成できます。

于 2013-03-27T10:54:39.997 に答える
0

いいえ。

力ずくの努力なしにこれから抜け出す方法はないと思います。

(スタックトレースを介して)開始されたRunnableまでさかのぼって、そのクラスの継承とインターフェイス階層を取得し、それらすべてのクラスでrun()メソッドとstart()メソッドを探します。誰かが相続に夢中になっているのでない限り、それほど長くはかからないはずです。

于 2013-03-27T10:54:43.550 に答える
0

私は最初にあなたがRunnable実行されているものを取得する必要があると思います。これは常にスタックトレースの最初の行であるため、簡単です。(もちろん、runメソッドを定義するクラスではなく、具象クラスが必要です。)クラスを取得したら、インスタンス化を簡単に見つけることができます。次に、スレッドが開始されるポイントまでたどるのは簡単なはずです。私は何か見落としてますか?

于 2013-03-27T11:09:15.203 に答える