4

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

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

我尝试了以下方法:

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

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

有没有更不方便的方法来清除这些幻像断点?

4

2 回答 2

8

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


不错的收获!我以前从未遇到过这个问题,但我设法通过切换 JDK 版本来重现它。我只是java.io.File从 JDK8 打开并在第 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++ (Windows SHIFTF8时,断点可用,但有旧源文件的描述:

断点

这让我开始思考,所以我试图找出断点的存储位置,结果发现它们位于<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 等时断点是否仍会出现在列表中,在这种情况下,很容易从本地 repo 引用旧 jar 的路径,但此时我无论如何不要认为这很重要。

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

在他们的跟踪器上快速搜索发现这个影响 v14.1.1(我目前在 14.1.6 上)的问题似乎还没有修复,所以我想我们只需要等到它得到修复(不知何故,因为对现在我想不出一个简单/体面的方法)。

于 2016-02-23T21:43:57.757 回答
0

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

于 2019-09-26T14:39:44.880 回答