首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行的java代码的日志行号

执行的java代码的日志行号
EN

Stack Overflow用户
提问于 2012-06-02 00:05:32
回答 5查看 1.2K关注 0票数 13

我正在编写一个PHP web应用程序的一部分(将在高中错误查找竞赛中使用),其中用户必须在给定的Java程序中找到错误。作为其中的一部分,当Java程序执行时,我们希望突出显示已执行代码的Java程序源代码中的行。要做到这一点,我们所需要的就是已经执行的源代码的行号,即代码路径(或者称为代码覆盖率?)。我们将使用行号突出显示源文件中的行。

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

非常感谢!

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

EN

回答 5

Stack Overflow用户

发布于 2012-06-02 00:20:48

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

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

这通常工作得很好,考虑到:编译器通常不会标记每条指令,源代码可能不可用,优化可能会使某些内部代码块不能以便于指向输入代码文本的方式工作。

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

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

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

无论如何,希望这篇文章能让你明白为什么它并不总是以与PHP完全相同的方式工作。

票数 4
EN

Stack Overflow用户

发布于 2012-06-02 00:27:43

看看Cobertura。它计算覆盖率之类的东西,如果它还没有这样做,那么将行号收集添加到它应该是相对容易的。这是一种非常黑客的尝试,但速度太慢,以至于您可能无法在生产https://bitbucket.org/jowu/myriapod/wiki/Home中使用它

票数 1
EN

Stack Overflow用户

发布于 2012-06-02 00:11:53

如果使用-g选项编译程序,执行printStackTrace(),捕获跟踪输出并从中提取行号,就可以获得行号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10853747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档