diff --git a/src/share/tools/hsdis/README b/src/share/tools/hsdis/README index fcfa8b48974828d55863331b31bcdc0b9aa8d0a8..f7eb8b8e29198a29d32cab0bc17d6a257286323b 100644 --- a/src/share/tools/hsdis/README +++ b/src/share/tools/hsdis/README @@ -75,8 +75,16 @@ will build the Win32 cross compiled version of hsdis based on 2.19.1. * Installing Products are named like build/$OS-$LIBARCH/hsdis-$LIBARCH.so. You can -install them on your LD_LIBRARY_PATH, or inside of your JRE next to -$LIBARCH/libjvm.so. +install them on your LD_LIBRARY_PATH, or inside of your JRE/JDK. The +search path in the JVM is: + +1. /jre/lib///libhsdis-.so +2. /jre/lib///hsdis-.so +3. /jre/lib//hsdis-.so +4. hsdis-.so (using LD_LIBRARY_PATH) + +Note that there's a bug in hotspot versions prior to hs22 that causes +steps 2 and 3 to fail when used with JDK7. Now test: diff --git a/src/share/vm/compiler/disassembler.cpp b/src/share/vm/compiler/disassembler.cpp index 0b4eb6dd6386e7a22286a1cfe6dd8a631c03e520..9603e863eddc61f733042dde11dc0e52d187f173 100644 --- a/src/share/vm/compiler/disassembler.cpp +++ b/src/share/vm/compiler/disassembler.cpp @@ -78,21 +78,46 @@ bool Disassembler::load_library() { char buf[JVM_MAXPATHLEN]; os::jvm_path(buf, sizeof(buf)); int jvm_offset = -1; + int lib_offset = -1; { // Match "jvm[^/]*" in jvm_path. const char* base = buf; const char* p = strrchr(buf, '/'); + if (p != NULL) lib_offset = p - base + 1; p = strstr(p ? p : base, "jvm"); if (p != NULL) jvm_offset = p - base; } + // Find the disassembler shared library. + // Search for several paths derived from libjvm, in this order: + // 1. /jre/lib///libhsdis-.so (for compatibility) + // 2. /jre/lib///hsdis-.so + // 3. /jre/lib//hsdis-.so + // 4. hsdis-.so (using LD_LIBRARY_PATH) if (jvm_offset >= 0) { - // Find the disassembler next to libjvm.so. + // 1. /jre/lib///libhsdis-.so strcpy(&buf[jvm_offset], hsdis_library_name); strcat(&buf[jvm_offset], os::dll_file_extension()); _library = os::dll_load(buf, ebuf, sizeof ebuf); + if (_library == NULL) { + // 2. /jre/lib///hsdis-.so + strcpy(&buf[lib_offset], hsdis_library_name); + strcat(&buf[lib_offset], os::dll_file_extension()); + _library = os::dll_load(buf, ebuf, sizeof ebuf); + } + if (_library == NULL) { + // 3. /jre/lib//hsdis-.so + buf[lib_offset - 1] = '\0'; + const char* p = strrchr(buf, '/'); + if (p != NULL) { + lib_offset = p - buf + 1; + strcpy(&buf[lib_offset], hsdis_library_name); + strcat(&buf[lib_offset], os::dll_file_extension()); + _library = os::dll_load(buf, ebuf, sizeof ebuf); + } + } } if (_library == NULL) { - // Try a free-floating lookup. + // 4. hsdis-.so (using LD_LIBRARY_PATH) strcpy(&buf[0], hsdis_library_name); strcat(&buf[0], os::dll_file_extension()); _library = os::dll_load(buf, ebuf, sizeof ebuf); @@ -249,7 +274,13 @@ address decode_env::handle_event(const char* event, address arg) { return arg; } } else if (match(event, "mach")) { - output()->print_cr("[Disassembling for mach='%s']", arg); + static char buffer[32] = { 0, }; + if (strcmp(buffer, (const char*)arg) != 0 || + strlen((const char*)arg) > sizeof(buffer) - 1) { + // Only print this when the mach changes + strncpy(buffer, (const char*)arg, sizeof(buffer) - 1); + output()->print_cr("[Disassembling for mach='%s']", arg); + } } else if (match(event, "format bytes-per-line")) { _bytes_per_line = (int) (intptr_t) arg; } else {