Chr*_*oph 18 java logging bytecode logback stack-trace
在我们的日志文件中,我们发现以下内容
[2012-09-24 00:09:32.590 +0000UTC] ERROR host server1 [] [] somepackage.someclass [] [Unknown] [V3rAqPaDvvAAAAExEXhdWGyh] [pjsQwTGHzxcAAAE5j4YdGvWV] "ThreadName" Some error happened: java.lang.ArrayIndexOutOfBoundsException: null
Run Code Online (Sandbox Code Playgroud)
只有这一行,没有异常堆栈跟踪.
try发生此异常的块是执行使用javassist创建的动态生成的Java字节码.
我想知道两件事:
java.lang.ArrayIndexOutOfBoundsException日期nulllogger.error("message", theException)在catch块内部使用日志挂钩调用,这通常会导致在日志文件中打印完整的堆栈跟踪.我的问题:
什么样的代码可以导致日志输出"java.lang.ArrayIndexOutOfBoundsException:null".我尝试用没有运气的测试程序重现这个.我总是得到像"java.lang.ArrayIndexOutOfBoundsException:Index:3"或类似的东西.
丢失堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger/JVM不会"知道"堆栈跟踪或相关的行号吗?
我们目前正在调试和调查以获取更多信息,但也许这听起来很熟悉.
Fra*_*eau 25
String与null引用连接可能会得到这样的消息:
Object obj = null;
throw new ArrayIndexOutOfBoundsException("" + obj);
Run Code Online (Sandbox Code Playgroud)如果您使用的是Oracle JVM,则可能需要添加-XX:-OmitStackTraceInFastThrow其他参数以查看它是否有帮助.对于一些基本异常,JVM会在一段时间后重用相同的异常实例,在这种情况下,不再有堆栈跟踪.此选项可防止重用,因此您始终可以获得堆栈跟踪.
编辑注释:最后一个版本也适用于OpenJDK的最新版本(例如,1.8)
我发现几乎相同的行为,但令人失望的日志如下所示:
java.lang.ArrayIndexOutOfBoundsException: null
Run Code Online (Sandbox Code Playgroud)
就我而言,问题出在并发 ArrayList.add 调用中(两个单独的线程将元素添加到共享的不同步列表中)。最有趣的事情:第一个ArrayIndexOutOfBoundsException 总是有堆栈跟踪和描述性消息,所有未来的ArrayIndexOutOfBoundsException 都没有堆栈跟踪和消息。尝试使用纯java线程在单独的项目上重现 - 没有运气(总是得到完整的堆栈跟踪等)。
附言。OpenJDK 11,码头服务器。
| 归档时间: |
|
| 查看次数: |
9720 次 |
| 最近记录: |