我试图切换到Intellij,但是当我加载我的项目时,调试器似乎在跳过行,并且在我尝试单步调试时不跟踪实际的源代码。我知道这是一个模糊的问题,但是有人知道导致Intellij在调试时不正确地链接到源代码的问题吗?
js81xvg61#
我唯一能想到的是,当前编译的类与您用来调试的源代码不匹配。在这种情况下,IntelliJ(或任何其他IDE)会从类中获取调试信息,比如行号,然后将其Map到您正在查看的当前源代码,以显示正在执行的代码。如果代码已过时,或者版本(源代码与编译得类)以任何方式不匹配,则可能发生得情况是,被调试得为IDE提供了显示某行得信息,但该信息在提供当前源代码时是不正确得,这可能会导致被调试得“跳转”行,或者只是在没有多大意义得位置停止.您是否重建了您的项目?这些源代码是否来自Jar中的类?您确定版本匹配吗?希望能有所帮助!
kq4fsx7k2#
我也遇到了同样的问题。你可以按照下面的步骤:1.删除生成/目标文件夹1.从文件关闭项目并1.从“最近使用的项目”中打开项目。1.再次调试现在调试器将命中您调试指针位置谢谢你:)
wyyhbhjk3#
我一直在与一个基于Gradle的项目的类似问题作斗争。我尝试了文件-〉同步,构建-〉清理项目,gradle clean build等的每一种组合。删除了.gradle缓存。反编译了.class文件,它看起来像是正确的版本。最后,我删除了项目中的所有build和out目录,尝试再次运行测试,最终获得了当前的源代码版本。我记得在Eclipse中我总是要处理Eclipse Dance。我猜这是IntelliJ的版本。更新:我发现这是一个随机重复出现的问题,所以我创建了一个别名来执行删除操作,如果你运行的是一个等同于Bash的程序的话。只需在你的.bashrc或.zshrc中设置别名,然后在你的项目目录中运行deletebuilds即可:
gradle clean build
build
out
.bashrc
.zshrc
deletebuilds
alias deletebuilds='find . | egrep "\.class$" | sed -e "s/\/build\/.*/\/build\//" | sort | uniq | xargs rm -rf'
这里假设编译后的类文件要放到build目录中,如果它们要放到其他地方,修改sed部分。
sed
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 project和Maven > Reimport。
Project Structure (Ctrl+Alt+Shift+S) > Modules
*.iml
Sync the project
Maven > Reimport
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
kqhtkvqz6#
在我的例子中,断点/调试器只对www.example.com不起作用Foo.java,结果Foo.java在我的测试(@MockBean)中被嘲笑了。
@MockBean
6条答案
按热度按时间js81xvg61#
我唯一能想到的是,当前编译的类与您用来调试的源代码不匹配。在这种情况下,IntelliJ(或任何其他IDE)会从类中获取调试信息,比如行号,然后将其Map到您正在查看的当前源代码,以显示正在执行的代码。
如果代码已过时,或者版本(源代码与编译得类)以任何方式不匹配,则可能发生得情况是,被调试得为IDE提供了显示某行得信息,但该信息在提供当前源代码时是不正确得,这可能会导致被调试得“跳转”行,或者只是在没有多大意义得位置停止.
您是否重建了您的项目?这些源代码是否来自Jar中的类?您确定版本匹配吗?
希望能有所帮助!
kq4fsx7k2#
我也遇到了同样的问题。你可以按照下面的步骤:
1.删除生成/目标文件夹
1.从文件关闭项目并
1.从“最近使用的项目”中打开项目。
1.再次调试现在调试器将命中您调试指针位置
谢谢你:)
wyyhbhjk3#
我一直在与一个基于Gradle的项目的类似问题作斗争。我尝试了文件-〉同步,构建-〉清理项目,
gradle clean build
等的每一种组合。删除了.gradle缓存。反编译了.class文件,它看起来像是正确的版本。最后,我删除了项目中的所有
build
和out
目录,尝试再次运行测试,最终获得了当前的源代码版本。我记得在Eclipse中我总是要处理Eclipse Dance。我猜这是IntelliJ的版本。
更新:我发现这是一个随机重复出现的问题,所以我创建了一个别名来执行删除操作,如果你运行的是一个等同于Bash的程序的话。只需在你的
.bashrc
或.zshrc
中设置别名,然后在你的项目目录中运行deletebuilds
即可:这里假设编译后的类文件要放到
build
目录中,如果它们要放到其他地方,修改sed
部分。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 project
和Maven > Reimport
。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
kqhtkvqz6#
在我的例子中,断点/调试器只对www.example.com不起作用Foo.java,结果Foo.java在我的测试(
@MockBean
)中被嘲笑了。