1

実行中の Scala プロセスがあり、そのプロセスで List の内容を取得したいと考えています。プロセスの PID と List[String] の名前がわかり、VisualVM でヒープ ダンプを取得しました。その特定のリストの実際の内容を見つけてどこかに保存する方法はありますか?

4

2 に答える 2

4

List[String]インスタンスがクラスによって (たとえば、 を介して) 参照されている場合は、それvalを保持しているクラスを探すことができます。

  • Eclipse Memory Analyzer (MAT)をダウンロードして、ヒープ ダンプを開くことができます。
  • 次に、「ドミネーター ツリー」をクリックすると、テーブルの上部に、リストを保持するクラスの名前を入力できます。
  • クラスが見つかった場合は、それを右クリックして [List objects -> With Incoming References] を選択すると、リストを潜在的に保持できるクラスのインスタンスが表示されます。
  • インスタンスの 1 つを右クリックし、[List objects -> With Outgoing References] を選択します。これにより、リストを見つけるツリー構造が表示されます。
  • リストを見つけたら、読み取り可能な情報を含む左側のパネル (インスペクター パネル) を確認できます。

注: 上記の手順は私の頭の上からのものであるため、完全に正確ではない可能性があります。ただし、これにより方向感覚が得られるはずです。

幸運を!

于 2013-02-18T21:00:33.400 に答える
2

原則としてそれは可能だと確信していますが、そうすることを可能にする単純で単純な既製のものは確かにありません。

おそらく、Java Platform Debugger Architecture(JPDA)とそのJava Debugging Wire Protocol(JDWP)を使用して、必要な生の情報を取得します。そこから、JavaやScalaリフレクションを使用して、ターゲットJVMで何を照会するかを検出できます。

これのどれだけがヒープダンプに適用できるかわかりません。昔は、C/Unixデバッグツールはコアダンプまたはアクティブプロセスのいずれかで動作する可能性がありました。

于 2013-02-18T20:54:43.660 に答える