我正在编写 PHP Web 应用程序的一部分(将在高中错误查找竞赛中使用),用户必须在给定的 Java 程序中查找错误。作为其中的一部分,当 Java 程序执行时,我们希望突出显示已执行代码的 Java 程序源代码行。为此,我们需要的是已执行的源代码的行号,即代码路径(或者称为代码覆盖率?)。我们将使用行号突出显示源文件中的行。
我们将使用 PHP 的 shell-exec() 来执行 Java 程序和获取代码路径(无论是什么)的工具。获取代码路径行号的最简单方法是什么?
非常感谢!
这是一张描述我们想要的图片
PHP 解释代码,这意味着每次运行程序时它都会运行源代码。这样做的好处是在读取代码时会爆炸(这使得行号打印输出变得微不足道);然而,它在其他方面通常是昂贵的,因为您无法深度优化(或进行任何运行前错误检查)。
Java 将其代码编译成称为“字节码”的 JVM 汇编语言。 http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html这意味着正在运行的程序通常无法访问(甚至使用)源代码。也就是说,有技巧。编译后的 Java 类能够添加“额外数据”,其中一个“额外数据元素”是行号表 http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#22856,这是一个索引,允许运行程序集的人“查找”行号正如编译器记录的那样.
这通常可以正常工作,但考虑到:编译器通常不会标记每条指令,源代码可能不可用,优化可能会使某些内部代码块无法以有助于指向输入代码文本的方式运行。
代码覆盖率工具如何“解决”这个问题是,它们通常会在代码中(在汇编级别)插入大量命令,这些命令有效地充当日志记录语句,其格式允许工具确定实际遵循的代码路径。然后通过行号表尽可能地映射回该行,然后用于突出显示原始源文件中的行。
如果您想要更高分辨率的东西(可以处理执行了一行的哪一部分的东西),那么您需要更深入地挖掘。最终,您甚至可以考虑编写自己的编译器(或编译器扩展),它将存储您自己的自定义行号表,以克服当前解决方案的缺点。
抛出异常(正如 Shiven 提到的)和解析行号之类的技巧确实有效;但是,它们会通过对真正需要的项目进行奇怪的异常处理来污染您的代码aren't例外,只是为了“获取行号”。由于代码混乱且异常的运行时性能通常较差,我倾向于避免此类解决方案(但它们确实有效)。
不管怎样,希望这能让您了解为什么它并不总是以与 PHP 完全相同的方式工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)