在 Java 中,有没有办法查看完整的、未截断的堆栈跟踪(例如,通过增加记录的帧数),或者以其他方式到达堆栈跟踪的底部?通常堆栈跟踪在 1024 帧处从顶部截断,但对于堆栈溢出问题,这是毫无价值的,因为您确实需要查看是谁发出了触发递归的调用,在底部附近。在堆栈中间截断会更好,但显然 Sun 的 JVM 不够聪明,无法做到这一点。
也许甚至是一些特殊的太阳特定标志?我尝试将堆栈大小减小到允许的最小值(-Xss1000),但这仍然超过 1024 帧的价值。
就我而言,我正在尝试调试 Hadoop 映射器中发生的堆栈溢出,但前提是在非常大的输入上运行时。我认为问题出现是因为递归操作(Scala's foldRight
)正在一个非常非常大的链表上完成,我需要以非递归方式重写它......但我需要知道是谁调用了foldRight
. 这是一个在很多地方直接和间接调用的基本例程,并且我正在使用大量代码,所以这是非常不明显的。