使用NO堆栈跟踪获取"ArrayIndexOutOfBoundsException:null"

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字节码.

我想知道两件事:

  1. java.lang.ArrayIndexOutOfBoundsException日期null
  2. 丢失的堆栈跟踪,尽管logger.error("message", theException)catch块内部使用日志挂钩调用,这通常会导致在日志文件中打印完整的堆栈跟踪.

我的问题:

  1. 什么样的代码可以导致日志输出"java.lang.ArrayIndexOutOfBoundsException:null".我尝试用没有运气的测试程序重现这个.我总是得到像"java.lang.ArrayIndexOutOfBoundsException:Index:3"或类似的东西.

  2. 丢失堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger/JVM不会"知道"堆栈跟踪或相关的行号吗?

我们目前正在调试和调查以获取更多信息,但也许这听起来很熟悉.

Fra*_*eau 25

  1. Stringnull引用连接可能会得到这样的消息:

    Object obj = null;
    throw new ArrayIndexOutOfBoundsException("" + obj);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您使用的是Oracle JVM,则可能需要添加-XX:-OmitStackTraceInFastThrow其他参数以查看它是否有帮助.对于一些基本异常,JVM会在一段时间后重用相同的异常实例,在这种情况下,不再有堆栈跟踪.此选项可防止重用,因此您始终可以获得堆栈跟踪.

编辑注释:最后一个版本也适用于OpenJDK的最新版本(例如,1.8)

  • 感谢 -XX:-OmitStackTraceInFastThrow。不知道那个旗帜。似乎是异常不再出现的原因。我们重新启动了服务器(没有设置这个标志),现在我们又看到了堆栈跟踪。 (2认同)

Vol*_*ret 5

我发现几乎相同的行为,但令人失望的日志如下所示:

java.lang.ArrayIndexOutOfBoundsException: null
Run Code Online (Sandbox Code Playgroud)

就我而言,问题出在并发 ArrayList.add 调用中(两个单独的线程将元素添加到共享的不同步列表中)。最有趣的事情:第一个ArrayIndexOutOfBoundsException 总是有堆栈跟踪和描述性消息,所有未来的ArrayIndexOutOfBoundsException 都没有堆栈跟踪和消息。尝试使用纯java线程在单独的项目上重现 - 没有运气(总是得到完整的堆栈跟踪等)。

附言。OpenJDK 11,码头服务器。

  • 我可以在 OpenJDK 8 上确认这一点,只有 **first** ArrayIndexOutOfBoundsException 有 stacktrace 。 (3认同)