了解Java调试在内部是如何工作的

5

我的问题与调试有关 - 特别是在Java / JVM上。

我想知道Java中的调试是如何工作的:

  • jdb / jvm如何将设置在Java源代码中的断点当前正在执行的字节码匹配。

请问有人可以回答上述问题和/或指向与JVM调试以及其工作方式相关的文档/规范吗?


我在这里找到了另一个有关Java调试的有趣帖子/答案:https://dev59.com/kXA65IYBdhLWcg3w2yo2#3591531,还有官方文档:http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/architecture.html和http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/。 - balteo
1个回答

5
查看javac文档: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html 特别地,javac默认或使用显式的-g选项(及其衍生选项)将原始源文件和行号存储在.class文件中。Java调试器将能够在运行时执行字节码时检索该信息,并将其与您的源代码匹配。
这就是为什么,如果您的运行时类路径与源文件不同步(即运行时类路径中存在“错误”的jar/.class文件),调试器有时会显示错误的行号,甚至显示似乎无法执行的行号。这是“错误”的运行时类路径问题(或者至少是源代码和编译代码之间的不一致)的典型特征。
[编辑]技术上,您可以使用-g:none减小.class/.jar文件的大小,但实际上,对于调试器和JVM可能最终打印出来的堆栈跟踪,源/行号信息非常有用,因此通常情况下建议保留。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接