Java类文件格式支持名为“源调试扩展”的属性(请参阅Java language specification §4.7.11 "TheSourceDebugExtension
attribute")。
在支持JVMTI这方面的JVM中,您可以使用jvmtiError GetSourceDebugExtension(jvmtiEnv *, jclass, char **)
查询此字符串。
我的问题是,是否有一种方法可以使用普通的javac
和Java语言在.class
文件中嵌入“源代码调试扩展”信息。核心Java语言中似乎没有注释可以执行此操作(在javadoc for java.lang.Annotation
的“所有已知实现类”列表中没有明显的候选者)。
该属性由JSR 45添加,以支持非Java语言的调试。 JVM本身不使用属性的值;它适用于调试工具。 The final release of that JSR描述了SourceDebugExtension
属性的动机如下:
SourceDebugExtension支持
调试器应用程序经常需要有关源的调试信息,这些信息超出了现有JavaTM虚拟机类文件属性(SourceFile,LineNumber和LocalVariable)所提供的信息。对于调试其他语言的来源尤其如此。在分布式环境中,可能无法访问侧面文件,该信息必须与该类直接关联。
解决方案是添加一个包含字符串的类文件属性;该字符串包含标准格式的调试信息,允许进化和供应商扩展。
鉴于这个目的,javac不太可能在该领域投入任何东西。还有另一个问题what JVM languages use the SMAP attribute的StackOverflow问题。