我正在尝试切换到Intellij,但是当我加载我的项目时,调试器似乎正在跳过行而不是在我尝试单步执行时跟踪实际源。我知道这是一个模糊的问题,但有没有人知道导致Intellij在调试时不正确地链接到源代码的问题?
答案 0 :(得分:3)
我唯一能想到的是当前编译的类与您用于调试的Source不匹配。 在这种情况下会发生的事情是IntelliJ(或任何其他IDE)从类中获取调试信息,关于行号,然后将其映射到您正在查看的当前源,以向您显示正在执行的代码。
如果代码已过时,或者版本(源代码和编译的类)以任何方式不匹配,则可能会发生调试,即IDE信息显示某条线,但该信息不正确当前的源代码,可能会导致看似调试的“跳跃”行,或者只是停留在没有多大意义的地方。
你重建了你的项目吗?这些来自Jar中的类,你确定版本匹配吗?
希望它有所帮助!
答案 1 :(得分:3)
我遇到了同样的问题。您可以按照以下步骤操作:
谢谢:)
答案 2 :(得分:1)
基于Gradle的项目,我一直在与类似的问题作斗争。我尝试了文件->同步,构建->清洁项目,gradle clean build
等的每种组合。删除了.gradle缓存。反编译.class文件,它看起来像是正确的版本。
最终,我最终只是删除了项目中的所有build
和out
目录,尝试再次运行测试并最终获得了当前的源版本。
我记得在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编译器:
答案 4 :(得分:0)
在Project Structure (Ctrl+Alt+Shift+S) > Modules
中,如果您将调试模块的任何jar添加到其他模块的依赖项中,则Intellij可能会使用该jar的反编译版本而不是最新的源代码,因此执行将在断点处暂停在反编译版本中。即使从不依赖于已调试模块的其他模块中调用已调试模块,也会发生此问题。
要解决此问题,只需从项目结构中所有模块的依赖项中删除已调试模块的jar。如果您不知道哪个模块具有已调试的模块jar作为依赖项,则可以使用某些工具(例如Sublime Text,bash等)来搜索存储在Intellij *.iml
文件中的模块名称。每个模块。删除后,您可能需要Sync the project
并执行Maven > Reimport
。