如何记录已执行过的Java代码行号?

我正在编写PHP Web应用程序的一部分(将在高中错误查找比赛中使用),用户必须在该应用程序中查找给定Java程序中的错误。作为其一部分,当执行Java程序时,我们要突出显示执行了代码的Java程序源代码中的各行。为此,我们所需要的只是已执行源代码的行号,即代码路径(或称为代码覆盖率?)。我们将使用行号突出显示源文件中的行。

我们将使用PHP的shell-exec()执行Java程序,并使用该工具获取代码路径(无论如何)。获取代码路径的行号的最简单方法是什么?

非常感谢你!

这是一张描述我们想要的图片

最佳答案

PHP插入代码,这意味着每次您运行该程序时,它都会在源代码上运行。这样做的好处是在读取代码时会炸掉(这使行号打印输出变得微不足道);但是,由于您无法进行深度优化(或执行任何运行前错误检查),因此在其他方面通常很昂贵。

Java compiles its code into a JVM assembly language called "bytecode."这意味着正在运行的内容通常无法访问(甚至无法使用)源代码。就是说,有技巧。编译后的Java类具有添加“额外数据”的能力,而这些“额外数据元素”之一是a line number table,它是一个索引,允许运行程序集的人在编译器记录行号时“查找”行号。

考虑到以下几点,通常这样做是可以的:编译器通常不会标记每条指令,源代码可能不可用,优化可能会使某些内部代码块无法以有助于指向输入代码文本的方式起作用。

代码覆盖率工具如何“修复”这是因为它们通常(在汇编级别)将大量命令有效地作为日志记录语句插入一种格式,该格式允许工具确定实际上遵循了代码的哪个路径。然后,将其尽可能最好地通过行号表映射回去,然后用于突出显示原始源文件中的行。

如果您想要分辨率更高的东西(可以处理行的哪一部分被执行的东西),则需要更深入地研究。最终,您甚至可以考虑编写自己的编译器(或编译器扩展),该代码将存储您自己的自定义行号表,从而克服了当前解决方案的缺点。

像抛出异常(如Shiven所提到的)和解析行号之类的技巧确实有效;但是,它们会使用奇怪的异常处理来污染您的代码,而这些异常处理实际上并不是异常(exception),只是为了“获得行号”。由于代码困惑,并且异常的运行时性能通常较差,因此我倾向于避免此类解决方案(但它们确实有效)。

无论如何,希望这会让您对为什么它并不总是与PHP完全相同的原因有所了解。

以上是 如何记录已执行过的Java代码行号? 的全部内容, 来源链接: www.h5w3.com/122307.html

回到顶部