项目期比较忙,很久没更新了,趁着有时间给大家做一则实际项目中的排查问题分享。
有一次排查线上问题的时候,发现一直再报空指针的错误信息,但是只有错误名称。没有堆栈信息,大家都懂,没有错误的堆栈信息,只能盲猜啊。压根不知道哪一行报错,报错的原因是什么。所以需要先想办法,让程序将堆栈信息打印出来,或者找到报错的堆栈信息才是解决问题的正确思路,这样一来就变成了两个问题。
1. 解决找不到报错堆栈信息的原因,并解决。
2. 通过报错信息解决实际bug。
好了,有了思路就开始下面的阅读并思考问题。
问题现象:
程序日志中大量打印异常,但是只有
java.lang.NullPointerException
没有更详细的信息,期初还以为打印日志的代码写的不规范。如图所示

问题原因:
是因为jvm进行了优化,如频繁的抛出某个异常,会重新编译,不再打印异常堆栈。此时要找堆栈就得到最开头去找了。。。可是最开头可能在几天前,可能日志早就被清理了。
问题解决步骤:
启动jar包时在 启动参数加上
-XX:-OmitStackTraceInFastThrow
禁用该优化,强制打印异常堆栈。当然这会损耗性能且日志过大咯
排查过程:
首先看下logger日志打印是否规范,如下所示:
log.info("打印的日志是:{}",eee);
log.error("数据格式有问题",e);
再看线上版本是否和线下版本不一致,保证线上线下代码一致,就不需要排查。
最后看下是否频繁报错,对号入座。
文章转载自全栈的程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




