如何修复Intellij调试问题?

时间:2011-11-09 21:48:56

标签: java debugging intellij-idea

我正在尝试切换到Intellij,但是当我加载我的项目时,调试器似乎正在跳过行而不是在我尝试单步执行时跟踪实际源。我知道这是一个模糊的问题,但有没有人知道导致Intellij在调试时不正确地链接到源代码的问题?

5 个答案:

答案 0 :(得分:3)

我唯一能想到的是当前编译的类与您用于调试的Source不匹配。 在这种情况下会发生的事情是IntelliJ(或任何其他IDE)从类中获取调试信息,关于行号,然后将其映射到您正在查看的当前源,以向您显示正在执行的代码。

如果代码已过时,或者版本(源代码和编译的类)以任何方式不匹配,则可能会发生调试,即IDE信息显示某条线,但该信息不正确当前的源代码,可能会导致看似调试的“跳跃”行,或者只是停留在没有多大意义的地方。

你重建了你的项目吗?这些来自Jar中的类,你确定版本匹配吗?

希望它有所帮助!

答案 1 :(得分:3)

我遇到了同样的问题。您可以按照以下步骤操作:

  1. 删除构建/目标文件夹
  2. 从文件中关闭项目,然后
  3. 从“最近的项目”中打开项目。
  4. 再次调试。现在调试器将命中您的调试指针位置

谢谢:)

答案 2 :(得分:1)

基于Gradle的项目,我一直在与类似的问题作斗争。我尝试了文件->同步,构建->清洁项目,gradle clean build等的每种组合。删除了.gradle缓存。反编译.class文件,它看起来像是正确的版本。

最终,我最终只是删除了项目中的所有buildout目录,尝试再次运行测试并最终获得了当前的源版本。

我记得在Eclipse中,我总是不得不处理Eclipse Dance。我想这是IntelliJ的版本。

更新:我发现这是一个随机发生的问题,因此,如果您正在运行等效的Bash,我创建了一个别名来执行删除操作。只需在.bashrc.zshrc中设置别名,然后在项目目录中运行deletebuilds

alias deletebuilds='find . | egrep "\.class$" | sed -e "s/\/build\/.*/\/build\//" | sort | uniq | xargs rm -rf'

这假设您的编译后的类文件将进入build目录。如果他们要去其他地方,请修改sed部分。

答案 3 :(得分:0)

您可以将IntelliJ配置为使用Eclipse java编译器,这可能会解决您的问题。从以下链接:

https://youtrack.jetbrains.com/issue/IDEA-8021

" 这不是关于众所周知的旧javac问题的第一个报告:对于一些try / catch和if / else结构,它会生成几个字节码指令,这些指令与行号错误地相关联。因此,当步进时,调试器遇到具有不同行号的跳转指令并决定停止它(因为行号已经改变)。 javac不应该为该指令分配不同的行号。

您在Eclipse中看到的不同行为只是因为它使用了自己的编译器,而且没有这个问题。如果将Eclipse配置为使用javac进行编译,那么您将完全看到所描述的行为。或者,您可以将IDEA设置为使用eclipse编译器来解决问题(仅适用于当前的EAP版本 - 构建5xxx - 它与eclipse编译器集成)"

另请参阅此Q关于配置Maven以使用Eclipse编译器:

Using Eclipse Java Compiler (ecj) in maven builds

答案 4 :(得分:0)

此问题可能类似于此问题https://intellij-support.jetbrains.com/hc/en-us/community/posts/206170749-IDEA-14-1-1-debugger-using-decompiled-code-instead-of-source-code

Project Structure (Ctrl+Alt+Shift+S) > Modules中,如果您将调试模块的任何jar添加到其他模块的依赖项中,则Intellij可能会使用该jar的反编译版本而不是最新的源代码,因此执行将在断点处暂停在反编译版本中。即使从不依赖于已调试模块的其他模块中调用已调试模块,也会发生此问题。

要解决此问题,只需从项目结构中所有模块的依赖项中删除已调试模块的jar。如果您不知道哪个模块具有已调试的模块jar作为依赖项,则可以使用某些工具(例如Sublime Text,bash等)来搜索存储在Intellij *.iml文件中的模块名称。每个模块。删除后,您可能需要Sync the project并执行Maven > Reimport