Changeset 32608

Show
Ignore:
Timestamp:
16.11.2018 14:24:39 (4 weeks ago)
Author:
ak19
Message:

Copying the methods printing out the caller (callstack) information from gli's Utility.java into core's Misc.java.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/util/Misc.java

    r31573 r32608  
    6666    }   
    6767    } 
     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     
    68118     
    69119    /** Method to determine if the host system is Windows based.