java - 了解 Java 调试的真正工作原理

标签 java debugging jvm jdb

我的问题与调试有关——尤其是在 java 中/在 jvm 上。

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

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

有人可以回答上述问题和/或向我指出与 jvm 调试及其工作原理相关的文档/规范吗?

最佳答案

在以下位置查看 javac 文档: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

特别是,默认情况下,javac 将在 .class 文件中存储原始源文件和行号,或者使用显式 -g 选项(及其派生选项)。 Java 调试器将能够在运行时执行字节代码时检索该信息,并将其与您的源代码相匹配。

这就是为什么,如果您的运行时类路径与您的源文件不同步(即“错误”的 jar/.class 文件在运行时类路径中),调试器有时会显示错误的行号,甚至行似乎不可执行的数字。这是“错误的”运行时类路径问题(或者至少是您的源代码与编译代码之间的不一致)的典型特征。

[已编辑] 从技术上讲,您可以使用 -g:none 减小 .class/.jar 文件的大小,但实际上这是最常见的充分利用磁盘空间,因为源代码/行号信息对于调试器和 JVM 可能最终为您打印的堆栈跟踪都将变得非常方便。

关于java - 了解 Java 调试的真正工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594289/

相关文章:

visual-studio - 将监视添加到实例而不是变量

windows - 函数 Hook 实际上是如何工作的? WinAPI, C++

java - 在/tmp/Linux 上更正 hsperfdata 的权限

java - 将值四舍五入到两位小数但仍然在 Eclipse (Java) 中返回 10 位小数?

java - LibGDX - 多台机器上的库

java - "The Local variable ' 名称 ' may not have been initialized"错误

debugging - Eclipse Scala 解释器 (REPL) - 正确使用和调试

java - 如何通过System.setProperty设置内存不受影响?

java - ClassLoader 可以用任何东西替换数组

java - 为什么应该首选 Java 类的接口(interface)?