RFR 8054008: Using -XX:-LazyBootClassLoader crashes with ACCESS_VIOLATION on Win 64bit
Jiangli Zhou
jiangli.zhou at oracle.com
Fri Nov 7 01:35:34 UTC 2014
Hi,
Please review the following changes that fix the crash with
-XX:-LazyBootClassLoader on windows x64 platforms (fastdebug only).
During VM initialization, current_stack_pointer() could be called
before the VM generates stub routines. The generated get_previous_sp
routine cannot be used during that time, use the estimated value for the
sp value instead. The x86 implementation is unaffected by the change and
always returns the estimated sp value as before.
bug: https://bugs.openjdk.java.net/browse/JDK-8054008
webrev: http://cr.openjdk.java.net/~jiangli/8054008/webrev/
Tested with JPRT and ExtBadJAR test.
Background:
As part of the VM initialization, classLoader_init() calls ZIP_Open from
the zip library for processing the boot class path when
-XX:-LazyBootClassLoader is specified. The call path re-enters VM before
returning from the zip library call. Following is the backtrace right
before when the crash happens. The windows x64 version of
current_stack_pointer() uses generated stub routine get_previous_sp
(generated by generate_get_previous_sp()) to obtain the stack pointer
value. Since classLoader_init() happens before stubRoutines_init1() and
the stub routines are not generated at the time, the execution jumps to
address 0 (referenced by _get_previous_sp_entry which should contain the
address of the generated routine after stubRoutines_init1()) when it's
trying to call the stub routine and crashes.
jvm.dll!os::current_stack_pointer() Line 468 C++
jvm.dll!os::verify_stack_alignment() Line 638 + 0x5 bytes C++
jvm.dll!JVM_NativePath(char * path) Line 691 C++
zip.dll!000007feebc49de0()
[Frames below may be incorrect and/or missing, no symbols loaded
for zip.dll]
zip.dll!000007feebc4af1d()
zip.dll!000007feebc4b004()
jvm.dll!ClassLoader::create_class_path_entry(const char * path,
const stat * st, bool lazy, bool throw_exception, Thread *
__the_thread__) Line 666 + 0x13 bytes C++
jvm.dll!ClassLoader::update_class_path_entry_list(const char *
path, bool check_for_duplicates, bool throw_exception) Line 763 + 0x2d
bytes C++
jvm.dll!ClassLoader::setup_search_path(const char * class_path)
Line 630 C++
jvm.dll!ClassLoader::setup_bootstrap_search_path() Line 594 C++
jvm.dll!ClassLoader::initialize() Line 1237 C++
jvm.dll!classLoader_init() Line 1291 C++
jvm.dll!init_globals() Line 100 C++
jvm.dll!Threads::create_vm(JavaVMInitArgs * args, bool *
canTryAgain) Line 3414 + 0x5 bytes C++
jvm.dll!JNI_CreateJavaVM(JavaVM_ * * vm, void * * penv, void *
args) Line 5199 + 0x12 bytes C++
java.exe!000000013f0520f6()
java.exe!000000013f05cb63()
java.exe!000000013f05cbf7()
kernel32.dll!0000000076ba59ed()
ntdll.dll!0000000076cdc541()
Thanks,
Jiangli
More information about the hotspot-runtime-dev
mailing list