e.printStackTrace()没有打印出完整的堆栈

单位里的一个很老的应用,在分析一个问题的时候,查看日志,看到打印异常的地方仅仅出现了一句:java.lang.NullPointerException。

该应用的源代码都已经找不到了(真的太老了),只能反编译class文件看,发现就是一句 e.printStackTrace(), 那也应该打印出堆栈啊,为什么堆栈没有打出来?

找到网上的几篇文章:
java.lang.NullPointerException:null 没有打印出任何堆栈信息的解决办法
NullPointerException in Java with no StackTrace

需要在java的启动命令中加入:
-XX:-OmitStackTraceInFastThrow

假如是 tomcat 的应用,那么需要在 bin/catalina.sh 中,大致如下位置,加入:

# $Id: catalina.sh 1146097 2011-07-13 15:25:05Z markt $
# -----------------------------------------------------------------------------

#在这个位置加入下面这一行
JAVA_OPTS=" -XX:-OmitStackTraceInFastThrow"

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
os400=false

重启后,堆栈出现了!

对这篇文章进行3个补充:
1,堆栈被丢弃,不单单出现在 e.printStackTrace() 中,还出现在 log4j,logback 中,比如打印日志如下:
logger.error(e.getMessage(), e);
这样,往往e的堆栈在上述情况下会不打印完整。
2,到目前为止,我只看到过 java.lang.NullPointerException:null 这样的异常,其他的异常发生堆栈被丢弃没有遇到过。
3,堆栈被丢弃,不仅仅发生在老版本的jdk上,新版本的jdk都会出现,也就是说jdk5,jdk6,jdk7,jdk8都会出现。

发表评论

邮箱地址不会被公开。 必填项已用*标注