When the topmost frame of a Java thread is an interpreted frame, the BCI printed in the crash log may be incorrect: when it shows +0, the actual BCI may be larger than that.
The BCX stored in the frame isn't always up-to-date. It only syncs up with the BCP register (ESI on x86, R13 on x64) at a few special points, such as when calling into the runtime, or other native code, or other Java methods.
If a Java thread crashed in the interpreter itself (e.g. segfault in write barrier due to card table corruption), then the info shown for the topmost interpreted Java frame might not be up-to-date. It's necessary to check the point of crash site, and the value in the BCP register.
Relevant code:
