记录执行的java代码的行号

Dan*_*B91 13 php java code-coverage

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

我们将使用PHP的shell-exec()来执行Java程序和工具以获取代码路径(无论将是什么).获取代码路径行号的最简单方法是什么?

非常感谢你!

这是描述我们想要的图片

在此输入图像描述

Edw*_*uck 4

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

Java 将其代码编译成称为“字节码”的 JVM 汇编语言。 这意味着正在运行的程序通常无法访问(甚至使用)源代码。也就是说,有技巧。编译后的 Java 类能够添加“额外数据”,其中一个“额外数据元素”是行号表,它是一个索引,允许运行程序集的人在编译器记录时“查找”行号。

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

代码覆盖率工具如何“解决”这个问题是,它们通常会在代码中(在汇编级别)插入大量命令,这些命令有效地充当日志记录语句,其格式允许工具确定实际遵循的代码路径。然后尽可能地通过行号表映射回该行,然后用于突出显示原始源文件中的行。

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

抛出异常(正如 Shiven 提到的)和解析行号之类的技巧确实有效;然而,它们会通过对实际上并不异常的项目进行奇怪的异常处理来污染您的代码,只是为了“获取行号”。由于代码混乱且异常的运行时性能通常较差,我倾向于避免此类解决方案(但它们确实有效)。

不管怎样,希望这能让您了解为什么它并不总是以与 PHP 完全相同的方式工作。