| 68 | |
| 69 | |
| 70 | /** |
| 71 | * Handy function to display the list of calling functions by |
| 72 | * printing out the stack trace even when you don't have an exception |
| 73 | */ |
| 74 | static public void printStackTrace() { |
| 75 | // https://stackoverflow.com/questions/1069066/get-current-stack-trace-in-java |
| 76 | |
| 77 | //Thread.dumpStack(); // looks too much like an exception, though the newlines separating each function call is handy |
| 78 | //new Exception().printStackTrace(); // outputs in the format of an exception too |
| 79 | //System.err.println("\n@@@@ stacktrace:\n" + Arrays.toString(Thread.currentThread().getStackTrace()) + "\n"); // outputs all in one line |
| 80 | |
| 81 | System.err.println("\n@@@@ stacktrace:"); |
| 82 | StackTraceElement[] els = new Throwable().getStackTrace(); // starts at index 1, which is this function |
| 83 | //StackTraceElement[] els = Thread.currentThread().getStackTrace(); starts at index 0, "java.lang.Thread.getStackTrace()" |
| 84 | for(StackTraceElement ste : els) { |
| 85 | System.err.println(" " + ste); |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | /** |
| 90 | * Handy function to display the parent of the calling function |
| 91 | * (the function that called the function that called printCaller()) |
| 92 | */ |
| 93 | static public void printCaller() { |
| 94 | int parent = 1; |
| 95 | // this function printCaller() itself adds another layer on the callstack since |
| 96 | // it calls the overloaded method, so need to add 1 more to parent |
| 97 | printCaller(parent++); |
| 98 | } |
| 99 | |
| 100 | /** |
| 101 | * Handy function to display the nth ancestor of the calling function |
| 102 | * where ancestor=0 would be the calling function itself |
| 103 | */ |
| 104 | static public void printCaller(int ancestor) { |
| 105 | // https://stackoverflow.com/questions/1069066/get-current-stack-trace-in-java |
| 106 | |
| 107 | // Thread.currentThread().getStackTrace() starts at index 0: "java.lang.Thread.getStackTrace()" |
| 108 | // index 1 will be this method (printCaller) and index 2 will be the calling function itself who wants |
| 109 | // to know who called it. So need to at least start at index 3 to get informative caller information |
| 110 | |
| 111 | StackTraceElement[] callstack = Thread.currentThread().getStackTrace(); |
| 112 | StackTraceElement requestor = callstack[2]; // the calling function, the function that called this one |
| 113 | StackTraceElement caller_requested = callstack[ancestor+3]; // the function requested |
| 114 | System.err.println("@@@ Function " + requestor + " called by:\n " |
| 115 | + caller_requested + " at " + ancestor + " ancestors back"); |
| 116 | } |
| 117 | |