在运行时使用 IntelliJ IDEA 调试器搜索整个 JVM 的值

use*_*782 4 java debugging intellij-idea

我在我们的应用程序中遇到了一些奇怪的文本格式,我需要找到原因。问题是我不知道从哪里开始查看我们的旧代码。

是否可以让 IntelliJ IDEA 调试器在 JVM 中的应用程序的整个实例中搜索值?与通常使用条件设置断点的方式相反。

Pio*_*zyk 5

从这个问题的评论来看,IntelliJ中没有这样的功能。

不过,您可以尝试执行堆转储,然后使用OQL进行搜索。可以在与 JDK 捆绑在一起的VisualVM工具中完成:

  1. 运行命令(假设您的 中jvisualvm有 JDK 的文件夹)。binPATH
  2. 启动您的应用程序,在Local下的左栏中找到它,然后从右键单击菜单中选择Heap Dump 。
  3. 前往OQL 控制台视图。在查询编辑器中,键入您的查询,例如:

    select s from java.lang.String s where s.toString().contains("hello")
    
    Run Code Online (Sandbox Code Playgroud)

    并执行它。

  4. 如果您的对象位于堆上,您应该会看到它。单击它并检查引用中的引用对象。

这应该会让您更接近您的对象所使用的类/对象。

有一些棘手的部分:

  • 您必须在有问题的对象被垃圾收集之前执行堆转储 - 也就是说,在您确定该对象已创建之后尽快执行(此处描述了获取堆转储的其他方法),
  • 该对象可能无法访问。在这种情况下,尝试查看它所属的对象图并找到仍然被引用的其他对象,
  • 该对象可能根本不存在于堆中(逃逸分析)。

另一个用于堆转储分析的工具是Eclipse Memory Analyzer (MAT)。(对于您的用例,请在分析堆转储之前启用“保留无法访问的对象”选项。)

您提到您需要在运行时搜索该值。但是,如果您怀疑要查找的是字符串文字,请尝试按照此答案中的描述搜索应用程序的 JAR 。