20

I ran into a Java StackOverflow error, but the offending recursive call is so deep, that it does not give me the full stack trace. It only dumps out the first 1024 lines of methods of the StackOverflow exception.

How can I get the full stack trace, so that I can know the root cause?

Jeff
  • 209
  • 1
  • 2
  • 3
  • 2
    Not an answer, but consider also debugging with breakpoints, logging, etc. – polygenelubricants Aug 05 '10 at 18:58
  • 1
    The root cause is in the first lines, the rest should look the same. Could you try to post the stacktrace to have a look at it? ( probably in pastebin.com or something like that? ) – OscarRyz Aug 05 '10 at 19:00
  • Are you using recursion by any chance? If so, this helps http://blogs.msdn.com/b/oldnewthing/archive/2009/01/07/9286576.aspx . See the related discussion on SO: http://stackoverflow.com/questions/951635/how-to-handle-stackoverflowerror-in-java – Vineet Reynolds Aug 05 '10 at 19:01
  • I would bet this is impossible. It might very well be so that the jvm intentionally has a limit on the number of stack frames to reify on exceptions. Otherwise the time complexity for throwing exceptions would be linear in the number of stack frames. – Tarrasch Apr 27 '14 at 15:24

3 Answers3

21

The switch -XX:MaxJavaStackTraceDepth allows larger and smaller stack trace lengths. Set it to -1 for an unlimited length. E.g.:

-XX:MaxJavaStackTraceDepth=-1
Dan Gravell
  • 7,855
  • 7
  • 41
  • 64
2

You can use -Xss to change the stack size, but it won't help if you have unbounded recursion. It sounds like your stopping condition might not be worked out.

Jonathon Faust
  • 12,396
  • 4
  • 50
  • 63
  • 7
    If anything, *lower* the stack size so the exception happens sooner and the stacktrace fits within the lines allowed! :-) – Mark Peters Aug 05 '10 at 19:23
-1

Print the stack manually, the limit put on e.printStackTrace() does not apply when you provide a writer (might need to quote me on that but I've never experienced it being cropped when using this method).

Here is some easy code that I employ to get full traces:

/**
 * Produces a Java-like stack trace string.
 * 
 * @param e
 * @return
 */
public static String exceptionStack(Throwable e) {
    final Writer result = new StringWriter();
    final PrintWriter printWriter = new PrintWriter(result);
    e.printStackTrace(printWriter);
    return result.toString();
}
BjornS
  • 1,004
  • 8
  • 19