【问题标题】:Line breakpoints don't work in some classes行断点在某些类中不起作用
【发布时间】:2013-05-28 14:45:41
【问题描述】:

我正在使用 intellij Idea 调试运行在 tomcat 上的应用程序。但是我有一个问题,在某些类中,行断点不起作用(方法断点工作正常......但速度很慢)。我可以通过从方法断点或另一个类进入类来访问特定的代码行或检查变量,但调试器不会在任何行上停止。 (IntelliJ 显示空的红色圆圈(没有十字))

更新:此问题不仅限于 Tomcat。我在不同项目的 Weblogic 上有同样的问题。所以这要么是Idea的问题,要么是Java的问题。

可能的原因是什么?没有特殊的编译器选项,当我反编译该类时,LineNumberTables 和 LocalVariableTables 就在那里。这两个类(一个行断点很好,一个没有)在同一个包中。我的来源与部署的代码完全匹配。我已经清除了所有 intellij idea 缓存(还有 [system]/jars,这里建议:Debugger doesn't stop at source code in Intellij IDEA

  • Java 1.6.0_43(64 位)
  • IntelliJ Idea 12.1.3
  • Tomcat 6.0.36
  • Debian 测试
  • 它适用于其他使用 Windows 的开发人员,所以这不是项目的问题

当我按照 CrazyCoder 的建议在 Idea 中启用调试器跟踪时,我会得到这些结果(显示在 IDEA 中添加/删除行断点时的输出):

没问题的班级

==== Enable Breakpoint ====
[JDI: Sending Command(id=25172) JDWP.EventRequest.Set]
[JDI: Sending:                 eventKind(byte): 8]
[JDI: Sending:                 suspendPolicy(byte): 1]
[JDI: Sending:                 modifiers(Modifier[]): ]
[JDI: Sending:                     modifiers[i](Modifier): ]
[JDI: Sending:                     modKind(byte): 5]
[JDI: Sending:                         classPattern(String): com.teamead.fwf.web.controller.ino.datauser.flightplan.EquipmentDefinition]
[JDI: Receiving Command(id=25172) JDWP.EventRequest.Set]
[JDI: Receiving:                requestID(int): 23]
[JDI: Retrieving matching ReferenceTypes, sig=Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/EquipmentDefinition;]
[JDI: Sending Command(id=25174) JDWP.VirtualMachine.ClassesBySignature]
[JDI: Sending:                 signature(String): Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/EquipmentDefinition;]
[JDI: Receiving Command(id=25174) JDWP.VirtualMachine.ClassesBySignature]
[JDI: Receiving:                classes(ClassInfo[]): ]
[JDI: Receiving:                    classes[i](ClassInfo): ]
[JDI: Receiving:                    refTypeTag(byte): 1]
[JDI: Receiving:                    typeID(long): ref=7269]
[JDI: Receiving:                    status(int): 7]
[JDI: Looking up Class, signature='Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/EquipmentDefinition;', id=7269]
[JDI: Sending Command(id=25176) JDWP.EventRequest.Set]
[JDI: Sending:                 eventKind(byte): 2]
[JDI: Sending:                 suspendPolicy(byte): 2]
[JDI: Sending:                 modifiers(Modifier[]): ]
[JDI: Sending:                     modifiers[i](Modifier): ]
[JDI: Sending:                     modKind(byte): 7]
[JDI: Sending:                         loc(Location): com.teamead.fwf.web.controller.ino.datauser.flightplan.EquipmentDefinition:24]
[JDI: Receiving Command(id=25176) JDWP.EventRequest.Set]
[JDI: Receiving:                requestID(int): 24]

==== Disable Breakpoint ====
[JDI: Sending Command(id=25178) JDWP.EventRequest.Clear]
[JDI: Sending:                 eventKind(byte): 2]
[JDI: Sending:                 requestID(int): 24]
[JDI: Receiving Command(id=25178) JDWP.EventRequest.Clear]
[JDI: Sending Command(id=25180) JDWP.EventRequest.Clear]
[JDI: Sending:                 eventKind(byte): 8]
[JDI: Sending:                 requestID(int): 23]
[JDI: Receiving Command(id=25180) JDWP.EventRequest.Clear]

不好的类

==== Enable Breakpoint ====
[JDI: Sending Command(id=25182) JDWP.EventRequest.Set]
[JDI: Sending:                 eventKind(byte): 8]
[JDI: Sending:                 suspendPolicy(byte): 1]
[JDI: Sending:                 modifiers(Modifier[]): ]
[JDI: Sending:                     modifiers[i](Modifier): ]
[JDI: Sending:                     modKind(byte): 5]
[JDI: Sending:                         classPattern(String): com.teamead.fwf.web.controller.ino.datauser.flightplan.FlightPlanBackingBean]
[JDI: Receiving Command(id=25182) JDWP.EventRequest.Set]
[JDI: Receiving:                requestID(int): 25]
[JDI: Retrieving matching ReferenceTypes, sig=Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/FlightPlanBackingBean;]
[JDI: Sending Command(id=25184) JDWP.VirtualMachine.ClassesBySignature]
[JDI: Sending:                 signature(String): Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/FlightPlanBackingBean;]
[JDI: Receiving Command(id=25184) JDWP.VirtualMachine.ClassesBySignature]
[JDI: Receiving:                classes(ClassInfo[]): ]
[JDI: Receiving:                    classes[i](ClassInfo): ]
[JDI: Receiving:                    refTypeTag(byte): 1]
[JDI: Receiving:                    typeID(long): ref=7257]
[JDI: Receiving:                    status(int): 7]
[JDI: Looking up Class, signature='Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/FlightPlanBackingBean;', id=7257]

==== Disable Breakpoint ====
[JDI: Sending Command(id=25186) JDWP.EventRequest.Clear]
[JDI: Sending:                 eventKind(byte): 8]
[JDI: Sending:                 requestID(int): 25]
[JDI: Receiving Command(id=25186) JDWP.EventRequest.Clear]

【问题讨论】:

  • 您是否在启用调试信息的情况下进行编译?您能否提供一个可以重现该问题的示例项目?
  • 是的。调试信息在那里(我已经反编译了这些类以查看它)。我认为我将无法重现该问题,因为它适用于一个类而不适用于另一个类,而且我还认为战争项目不符合问题中发布的有关代码长度的准则。
  • 您可以压缩并通过 Dropbox / Google Drive / 共享示例。
  • crazycoder:我发现这在项目中不是问题。它适用于同事:(
  • 您可以通过idea.sh从终端运行IDEA,并将-Didea.debugger.trace=ALL添加到vmoptions中。这可能有助于了解调试器内部发生的情况,消息将打印在控制台中。

标签: java debugging tomcat intellij-idea


【解决方案1】:

我遇到了完全相同的问题并且刚刚解决了它 - 不知道您的设置是否相同,但我的问题是我的类文件正在输出到我的模块内容根目录下的文件夹中(即使我的模块设置中确实将该文件夹标记为已排除)。

我删除了所有本地类文件,更新了编译器输出设置以指向我的内容根目录之外,重建了项目,现在一切都按预期工作。

【讨论】:

  • 所以您是说在您的应用程序中,该类被打包了两次?我检查了爆炸的战争,我在 WEB-INF 下只有一个该类的实例。我正在使用 Maven 构建。 “更新编译器输出设置以指向我的内容根目录之外”是什么意思?
  • 就我而言,问题在于本地类文件,而不是部署的应用程序。我的ant build是在war文件中打包WEB-INF下的类文件,但这也反映在我的源代码树中的本地WEB-INF文件夹中。当我从本地 WEB-INF 文件夹中删除类文件时,问题就消失了。
  • 构建后,我的源代码树中没有任何类。
【解决方案2】:

我在 intelliJ Idea 服务台上获得了进一步的支持,但问题是暂时的?通过从我的本地 maven 存储库中删除 war 文件来修复。

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2022-12-29
    • 2020-04-28
    相关资源
    最近更新 更多