I am working on very huge java web based application. As there is no proper logging done while development so its very difficult for me to put break point and debug the app as i dont know execution order. Is there any mechanism to get complete Call Stack of the the running java application after I perform some actions.
I searched it on net for long time but cannot came to concrete solution. Please suggest me if something is there for it. Thanks
There are some options:
Add some basic logging to your code:
That will pring a static trace to stderr
Method 1: Use jstack utility from command line (part of the JDK distro).
Method 2: Send signal 3 to the java process, it will dump stack traces on stdout.
Method 3: Call Thread.getAllStackTraces () from within application:
Then use
StackTraceDumper.dumpAllStackTraces()
where you need to dump stack traces.Why don't you use some AOP tool like AspectJ to capture these values and log? You can use execution() point cut along with after() advice. For non production deployment you can log all the method calls along with passed values and returned value. This will be too much overhead for production env. For that you can just store the passed values (Object args[] as you get in AspectJ advice) in local variable and only log it in case of exception. But even in that case there will be some performance penalty as primitive values will be boxed to be passed as Object[] to your advice.
Thread.dumpStack()
Prints a stack trace of the current thread to the standard error stream.Thread.getAllStackTraces()
Returns a map of stack traces for all live threads.Thread.getStackTrace()
Returns an array of stack trace elements representing the stack dump of this thread.You can trigger a stack dump via pressing Ctrl+Break, or sending a signal 3 (on Unix-based systems). Note that you'll get a stack trace per-thread. This will go to standard error, so make sure your logging is capturing this.
You can do this programatically via
Here's more info on getting and analysing stack traces.
As you've noted, BTrace is another possibility. Here's an SO answer on using it.
Have a look at
Throwable.getStackTrace()
. Just create a newThrowable
; you don't actually have tothrow
it.