Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Include filename/line number corresponding to System.out.print statements in Eclipse Console

Tags:

java

eclipse

Is there a way to show line numbers in the Eclipse console?

My intent here is to show in the Eclipse console the file/line number that produced the output, not a serial line numbering of the messages (although that could also be an interesting question).

I am looking for something similar to Chrome's javascript console, where every line has a link that takes you to the function that printed it.

like image 753
sangil Avatar asked May 25 '15 11:05

sangil


1 Answers

You can create a custom PrintStream that inspects the current stack trace and includes file / line numbers in the output. You can then use System.setOut/System.setErr to cause all stdout/stderr output to include this information.

By formatting it properly Eclipse will pick it up as stack trace elements and generate links.

Here's a complete demo:

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 Console:

enter image description here

I consider this to be a hack though, and I wouldn't use it for anything but casual debugging.

like image 110
aioobe Avatar answered Sep 25 '22 15:09

aioobe