我正在使用mvnDebug
调试maven:jdb -attach 8000
。
我尝试放置断点,但得到:
main[1] stop in DeployMojo.DeployMojo
Deferring breakpoint DeployMojo.DeployMojo.
It will be set after the class is loaded.
main[1] stop at Dependency:66
Deferring breakpoint Dependency:66.
It will be set after the class is loaded.
当我运行时,不会调用断点。我有源代码(使用 maven 命令生成),但如何使它们可供调试器使用?
是否有可以放置断点的类加载器?
这可能是因为您的类名错误或您省略了包。如果类 Dependency
在包 com.my.package
中,则在类 com.my.package.Dependency
中中断,而不是在Dependency
中中断。
我正在使用jdb -attach -sourcepath ~/path/to/project/main/java
.事实证明,jdb不喜欢~
,需要jdb -attach -sourcepath $HOME/path/to/project/main/java
或绝对路径。
对我来说,tibtof的回答只是我需要的一半,让它工作。在我显式添加包名称后,jdb 将在我的这个 gradle 项目上产生"尝试使用调试进行编译":
> Unable to set deferred breakpoint package.ClassName:LineNumber : No linenumber information for package.ClassName. Try compiling with debugging on.
在这种情况下,如果您使用的是 gradle,则需要确保options.debug=true
compileJava
任务中,您可以使用下面的println
进行检查。
就我而言,我正在编译调试 - 或者我是这么认为的。我有这样的build.gradle
(基于这个答案和这篇文章):
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xlint:all' << '-Werror' << '-g'
options.debug = project.hasProperty('debug')
options.debugOptions.debugLevel = 'source,lines,vars'
options.debugOptions.debugLevel = 'source,lines,vars'
doLast {
println "Args for for $name are $options.allCompilerArgs"
println "debug=$options.debug"
}
}
当我运行./gradlew build -Pdebug
时,它按预期打印:
Args for for compileJava are [-Xlint:all, -Werror, -g]
debug=true
事实证明,当我后来运行./gradlew runMyTask --debug-jvm
时,它重新运行了compileJava
任务,因为我没有再次传递-Pdebug
。运行 gradle 与 --info
证实了这一点:
Task ':compileJava' is not up-to-date because:
Value of input property 'options.debug' has changed for task ':compileJava'
当我添加上述println
几个小时后,这一事实才变得明显:
afarah@gentoopc $ ./gradlew runMyTask --debug-jvm
> Task :compileJava
Args for for compileJava are [-Xlint:all, -Werror, -g]
debug=false
> Task :runMyTask
Listening for transport dt_socket at address: 5005
所以解决方案是运行./gradlew runMyTask --debug-jvm -Pdebug
,即再次传递-Pdebug
:
afarah@gentoopc $ ./gradlew runMyTask --debug-jvm -Pdebug
> Task :compileJava
Args for for compileJava are [-Xlint:all, -Werror, -g]
debug=true
> Task :runMyTask
Listening for transport dt_socket at address: 5005
注意现在debug=true
,最后 jdb 没有抱怨,停在我的 LineNumber 断点处。