在Eclipse Console中包含与System.out.print语句对应的文件名/行号

有没有办法在Eclipse控制台中显示行号?

我的目的是在Eclipse控制台中显示产生输出的文件/行号,而不是消息的串行编号(尽管这也可能是一个有趣的问题)。

我正在寻找类似Chrome的javascript控制台,其中每一行都有一个链接,可以将您带到打印它的function。

您可以创建一个自定义PrintStream来检查当前堆栈跟踪并在输出中包含文件/行号。 然后,您可以使用System.setOut / System.setErr使所有stdout / stderr输出包含此信息。

通过正确格式化,Eclipse将把它作为堆栈跟踪元素并将其生成链接。

这是一个完整的演示:

 public class Main { public static void main(String args[]) { System.setOut(new java.io.PrintStream(System.out) { private StackTraceElement getCallSite() { for (StackTraceElement e : Thread.currentThread() .getStackTrace()) if (!e.getMethodName().equals("getStackTrace") && !e.getClassName().equals(getClass().getName())) return e; return null; } @Override public void println(String s) { println((Object) s); } @Override public void println(Object o) { StackTraceElement e = getCallSite(); String callSite = e == null ? "??" : String.format("%s.%s(%s:%d)", e.getClassName(), e.getMethodName(), e.getFileName(), e.getLineNumber()); super.println(o + "\t\tat " + callSite); } }); System.out.println("Hello world"); printStuff(); } public static void printStuff() { System.out.println("More output!"); } } 

Eclipse控制台:

在此处输入图像描述

我认为这是一个黑客,我不会用它来做任何事情,只是随便调试。

您需要将行输出添加到exception处理程序。

例如:

 ... } catch (Exception e) { System.out.println(e.getStackTrace()[0].getLineNumber()); } ... 

此代码将打印出导致exception的行。

首先,我将用我自己的语言重新解释您的问题,以便您可以检查我的问题是否正确:您希望将所有控制台输出链接到生成它的源代码。

在这种情况下,如果不使用某些修改标准库(System.out和System.err),这是不可能的。 这样的代码可能会使用当前的堆栈跟踪 (参见例如, 有没有办法转储堆栈跟踪而不在java中抛出exception? )来确定调用print-statement的代码(和行号)。 下一步是创建一个eclipse插件,它使用收集的信息跳转到确定的行(或者让eclipse认为它正在显示堆栈跟踪)。