Missing stack traces after C1 code replaced with C2 code
Ivan Kozik
ivan at ludios.org
Fri Mar 21 05:46:11 UTC 2014
There is a long-standing HotSpot bug in tiered compilation when it
upgrades code from tier 3 to tier 4. After this code upgrade happens,
stack traces are repeatedly thrown away, at least in Clojure programs.
Repro steps are:
wget http://repo2.maven.org/maven2/org/clojure/clojure/1.6.0-RC1/clojure-1.6.0-RC1.jar
rlwrap java -jar clojure-1.6.0-RC1.jar
(inc nil) (pst)
keep repeating (inc nil) (pst) until you see:
NullPointerException [trace missing]
or, to avoid having to hit Up/Enter as much:
(dotimes [_ 1000] (try (inc nil) (catch Throwable e (.printStackTrace e))))
which will usually require just 2 invocations, but sometimes up to 5.
I see this bug in both IcedTea and Oracle Java 7 and 8, on all of
Ubuntu, Windows 7, and Mountain Lion. I don't see the bug when
TieredCompilation is turned off, or when it is limited to tier 3.
This was originally discovered in
https://github.com/technomancy/leiningen/issues/1025 and the
workaround (for leiningen users) was to limit the compilation tier. I
expect that Clojure users will be running into this problem more
frequently now that tiered compilation is on by default.
Unfortunately, I am not familiar with the internals of
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java
to know if Clojure might be doing something peculiar with JVM
bytecode. It wouldn't be something new; Clojure 1.0, 1.1, 1.2.1, 1.3,
1.4, 1.5.1, and 1.6.0-RC1 are affected.
I originally reported this to bugs.sun.com in February 2013 and it was
assigned internal review ID 2456988. AFAIK, the bug did not make it
into bugs.sun.com or bugs.openjdk.java.net. I later asked #openjdk
about it and was told to report it here.
Thanks,
Ivan
More information about the hotspot-compiler-dev
mailing list