如何从Intellij IDEA中删除(幻影)指向旧/缺少源的断点?

时间:2016-02-23 17:18:36

标签: java debugging intellij-idea intellij-14 intellij-15

使用Intellij(v14和现在的v15)我已经设置了断点来调试来自Tomcat 7+中运行的Web应用程序的外部依赖项(通常是快照版本)的尚未发布的类。

当我将外部依赖项更改为已发布的版本时,重新编译项目并以调试模式运行;即使断点列表视图中不再存在断点,IntelliJ仍会暂停旧类断点的执行(从菜单:运行>断点)。

我尝试了以下内容:

  • 在启动应用程序之前清理并重建所有工件,以确保已部署的应用程序具有更新的依赖项。
  • 运行“无效的缓存/重新启动”功能,清除我心爱的文件更改历史记录,但不清除这些断点。
  • 删除所有断点:(清除当前有效断点,但不清除幻像断点,因为它们不在当前列表中)

对我来说唯一有用的,就是重新附加确切的旧源jar(尽可能)查找受影响的类并从那里删除断点。

清除这些幻像断点是否有任何不方便的方法?

2 个答案:

答案 0 :(得分:6)

免责声明:这可能最适合作为评论,但不适合有限数量的字符。

好的抓住!我之前从未遇到过这个问题,但我设法通过切换JDK版本来重现它。我只是从JDK8打开java.io.File并在第276行设置断点:

public File(String pathname) {
    if (pathname == null) { // <= breakpoint here
        throw new NullPointerException();
    }
    this.path = fs.normalize(pathname);
    this.prefixLength = fs.prefixLength(this.path);
}

然后我切换到JDK6,它在该行上有一个简单的右花括号(})。但是,当按 CTRL + SHIFT + F8 (windows)时,断点可用,但具有旧源文件的描述:

breakpoints

这让我思考,所以我试图弄清楚断点的存储位置,结果发现它们位于<project root>/.idea/workspace.xml部分下的<component name="XDebuggerManager">

<component name="XDebuggerManager">
    <breakpoint-manager>
      <breakpoints>
        ...
        <line-breakpoint enabled="true" type="java-line">
          <url>jar://C:/Program Files/Java/jdk1.8.0_45/src.zip!/java/io/File.java</url>
          <line>275</line>
          <properties />
          <option name="timeStamp" value="4" />
        </line-breakpoint>
      </breakpoints>
      ...

所以看起来它保留了对初始文件的引用。当你使用maven,gradle等时,我不确定断点是否仍然会出现在列表中,在这种情况下很容易从本地仓库引用旧jar的路径,但此时我不管怎么说,这不重要。

快速解决方法(可能?!):尽管如此,如果您手动从xml中删除幻像断点并保存文件,IJ将自动获取更改,并更新设置。在完成之后,断点不再出现在我的列表中。

快速搜索他们的跟踪器显示this issue影响了v14.1.1(我目前在14.1.6),这似乎还没有修复,所以我想我们只需要等到它修复(不知何故,因为现在我想不出简单/体面的方式)。

答案 1 :(得分:0)

如果您有多个相互链接的应用程序。这将有助于将“ CORRECT”应用程序重新部署到您的服务器。我就是这种情况。检查是否已将正确的war文件部署到您的服务器。