1

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

4

2 回答 2

4

如果List[String]实例被一个类引用(例如通过 a val),那么您可以查找包含它的类。

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

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

祝你好运!

于 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 回答