它是调试器对我正在调试的Scala代码有影响吗?

时间:2011-01-14 05:45:02

标签: debugging scala jvm

我想知道在调试Scala代码而不是Java代码时它与调试器(Intellij IDEA + Scala插件)​​有什么不同。根据我的理解,调试器与语言紧密耦合,即Java调试器无法处理Scala代码,但显然JVM是这里的关注焦点,只要它是字节码,任何调试器都可以。对吗?

重要更新:问题是举例说明字节码调试器如何限制Scala。假设达到了一个断点,我不想转到下一行,但我希望调试器在应用程序的上下文中评估Scala表达式(例如,我喜欢从单例对象调用一个运算符方法)。调试器被卡住了,因为它无法理解Scala。我必须自己进行转换并将生成的Java输入到调试器。 问题是只能在字节码级别处理“断点东西”。如果你想表达一个表达式怎么办?调试器必须了解Scala来评估观察到的表达式,对吧?这次我确定我是对的。主说,复仇是我的;-)

1 个答案:

答案 0 :(得分:8)

简短回答你的假设是错误的。

原因是调试器不关心你的调试语言。它在断点处停止,而断点又包括特定源文件的行。请注意,源文件只是供您阅读的文本 - 调试器永远不会扫描源文件。如果您将源文件所在的位置更改为右侧目录中的文本文件w /正确的文件名作为已设置的断点,则调试器将在断点发生时愉快地显示它。每当你设置一个断点时,你的ide就会告诉调试器你会扫描这个类,看看这行上的任何字节码,当你点击它时就停止。如果你的ide试图将相同的文本文件编译成类文件,这当然不起作用 - 但是如果你创建假文本文件作为jar文件的源并执行源文件映射的话,它将会起作用。

如果考虑一下,编写一个简单的模板并在支持调试的同时编译它并不困难。只需使用asm来创建所有的print语句,并告诉asm这个print语句来自这行的模板文件。之后,您可以添加更多聪明的东西,同时保持可调试性。