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