在正在运行的进程中获取scala List的内容?

时间:2013-02-18 20:12:00

标签: scala heap-dump

我有一个正在运行的Scala进程,并希望在该进程中获取List的内容。我知道进程的PID,我知道List [String]的名称,并且我已经使用VisualVM进行了堆转储。有没有办法让我找到该特定列表的实际内容并将其保存在某个地方?

2 个答案:

答案 0 :(得分:4)

如果某个类引用List[String]实例(例如通过val),则可以查找包含它的类。

  • 您可以下载Eclipse Memory Analyzer (MAT)并打开堆转储。
  • 然后,您可以单击“Dominator tree”,然后在表格的顶部键入包含列表的类的名称。
  • 如果您找到了该类,请右键单击它并选择“列出对象 - >使用Incoming References`,它应该为您提供所有可能包含列表的类的实例。
  • 右键单击其中一个实例,然后选择“列出对象 - >使用“传出引用”,可以为您提供一个树结构,您可以在其中找到列表
  • 请注意,找到列表后,您可以查看左侧面板(检查器面板),其中包含可读信息。

注意:上面的步骤来自我的脑海,所以它们可能不完全准确。然而,这应该给你一个良好的方向感。

祝你好运!

答案 1 :(得分:2)

我原则上确信这是可能的,但肯定没有什么简单或直接的,现成的,你可以这样做。

我可能会使用Java Platform Debugger Architecture (JPDA)及其Java Debugging Wire Protocol (JDWP)来获取您需要的原始信息。从那里,您可以使用Java和/或Scala反射来发现在目标JVM中查询的内容。

我不知道这有多少适用于堆转储。在过去,C / Unix调试工具可以在核心转储或活动进程上运行。