debugging 如何修复Intellij调试问题?

yqlxgs2m  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(216)

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

js81xvg6

js81xvg61#

我唯一能想到的是,当前编译的类与您用来调试的源代码不匹配。在这种情况下,IntelliJ(或任何其他IDE)会从类中获取调试信息,比如行号,然后将其Map到您正在查看的当前源代码,以显示正在执行的代码。
如果代码已过时,或者版本(源代码与编译得类)以任何方式不匹配,则可能发生得情况是,被调试得为IDE提供了显示某行得信息,但该信息在提供当前源代码时是不正确得,这可能会导致被调试得“跳转”行,或者只是在没有多大意义得位置停止.
您是否重建了您的项目?这些源代码是否来自Jar中的类?您确定版本匹配吗?
希望能有所帮助!

kq4fsx7k

kq4fsx7k2#

我也遇到了同样的问题。你可以按照下面的步骤:
1.删除生成/目标文件夹
1.从文件关闭项目并
1.从“最近使用的项目”中打开项目。
1.再次调试现在调试器将命中您调试指针位置
谢谢你:)

wyyhbhjk

wyyhbhjk3#

我一直在与一个基于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部分。

omjgkv6w

omjgkv6w4#

此问题可能与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从ProjectStructure中所有模块的依赖项中移除即可。(例如Sublime Text、bash ...)来搜寻储存在每个模块Intellij *.iml档案中的模块名称。移除后,您可能需要执行Sync the projectMaven > Reimport

f87krz0w

f87krz0w5#

您可以将IntelliJ配置为使用Eclipse java编译器,这可能会解决您的问题。从以下链接:
https://youtrack.jetbrains.com/issue/IDEA-8021
“这不是第一次报告关于众所周知的旧javac问题:对于某些try/catch和if/else结构,它会生成几条字节码指令,这些指令错误地与行号关联。因此,在单步执行时,调试器遇到具有不同行号的跳转指令,并决定在该指令处停止(因为行号已更改)。javac不应为该指令分配不同的行号。
您在Eclipse中看到不同的行为只是因为它使用自己的编译器,而编译器没有这个问题。如果您将Eclipse配置为使用javac进行编译,您将看到所描述的行为。或者,您可以设置IDEA使用Eclipse编译器来解决这个问题(仅适用于当前的EAP版本-内部版本5xxx -它与Eclipse编译器集成)”
有关配置Maven以使用Eclipse编译器的信息,另请参见此问题:
Using Eclipse Java Compiler (ecj) in maven builds

kqhtkvqz

kqhtkvqz6#

在我的例子中,断点/调试器只对www.example.com不起作用Foo.java,结果Foo.java在我的测试(@MockBean)中被嘲笑了。

相关问题