问题 如何避免1024行Java异常堆栈限制


我遇到了Java StackOverflow错误,但是有问题的递归调用是如此之深,以至于它没有给我完整的堆栈跟踪。它只会转储StackOverflow异常的前1024行方法。

如何获得完整的堆栈跟踪,以便我知道根本原因?


9074
2017-08-05 18:54


起源

不是答案,但还要考虑使用断点,日志记录等进行调试。 - polygenelubricants
根本原因在第一行,其余部分应该看起来相同。您可以尝试发布堆栈跟踪来查看它吗? (可能在pastebin.com或类似的东西?) - OscarRyz
你有机会使用递归吗?如果是这样,这有帮助 blogs.msdn.com/b/oldnewthing/archive/2009/01/07/9286576.aspx 。参见有关SO的相关讨论: stackoverflow.com/questions/951635/... - Vineet Reynolds
我敢打赌这是不可能的。很可能jvm故意限制堆栈帧的数量来实现异常。否则,抛出异常的时间复杂度将是堆栈帧数的线性。 - Tarrasch


答案:


开关 -XX:MaxJavaStackTraceDepth 允许更大和更小的堆栈走线长度。将其设置为 -1 无限长度。例如。:

-XX:MaxJavaStackTraceDepth=-1

10
2018-03-09 14:49





您可以使用-Xss来更改堆栈大小,但如果您有无限递归则无效。听起来你的停止条件可能没有解决。


1
2017-08-05 18:57



如果有什么, 降低 堆栈大小,以便更快地发生异常,堆栈跟踪适合允许的行! :-) - Mark Peters


手动打印堆栈,当你提供一个编写器时,e.printStackTrace()的限制不适用(可能需要引用我,但我从未体验过使用这种方法时被裁剪)。

这是一些简单的代码,我用来获得完整的跟踪:

/**
 * 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();
}

1
2017-08-06 09:37



不起作用。我只有1024行,它没有显示根本原因。 - Pacerier