1.1 --- a/src/os/solaris/vm/os_solaris.cpp Tue Nov 23 13:22:55 2010 -0800 1.2 +++ b/src/os/solaris/vm/os_solaris.cpp Sat Dec 11 13:20:56 2010 -0500 1.3 @@ -58,6 +58,7 @@ 1.4 #include "services/attachListener.hpp" 1.5 #include "services/runtimeService.hpp" 1.6 #include "thread_solaris.inline.hpp" 1.7 +#include "utilities/decoder.hpp" 1.8 #include "utilities/defaultStream.hpp" 1.9 #include "utilities/events.hpp" 1.10 #include "utilities/growableArray.hpp" 1.11 @@ -1967,27 +1968,42 @@ 1.12 Sym * info; 1.13 if (dladdr1_func((void *)addr, &dlinfo, (void **)&info, 1.14 RTLD_DL_SYMENT)) { 1.15 - if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); 1.16 - if (offset) *offset = addr - (address)dlinfo.dli_saddr; 1.17 - 1.18 - // check if the returned symbol really covers addr 1.19 - return ((char *)dlinfo.dli_saddr + info->st_size > (char *)addr); 1.20 - } else { 1.21 - if (buf) buf[0] = '\0'; 1.22 - if (offset) *offset = -1; 1.23 - return false; 1.24 + if ((char *)dlinfo.dli_saddr + info->st_size > (char *)addr) { 1.25 + if (buf != NULL) { 1.26 + if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) 1.27 + jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); 1.28 + } 1.29 + if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; 1.30 + return true; 1.31 + } 1.32 } 1.33 + if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { 1.34 + if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), 1.35 + dlinfo.dli_fname, buf, buflen, offset) == Decoder::no_error) { 1.36 + return true; 1.37 + } 1.38 + } 1.39 + if (buf != NULL) buf[0] = '\0'; 1.40 + if (offset != NULL) *offset = -1; 1.41 + return false; 1.42 } else { 1.43 // no, only dladdr is available 1.44 - if(dladdr((void *)addr, &dlinfo)) { 1.45 - if (buf) jio_snprintf(buf, buflen, dlinfo.dli_sname); 1.46 - if (offset) *offset = addr - (address)dlinfo.dli_saddr; 1.47 + if (dladdr((void *)addr, &dlinfo)) { 1.48 + if (buf != NULL) { 1.49 + if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) 1.50 + jio_snprintf(buf, buflen, dlinfo.dli_sname); 1.51 + } 1.52 + if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; 1.53 + return true; 1.54 + } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { 1.55 + if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), 1.56 + dlinfo.dli_fname, buf, buflen, offset) == Decoder::no_error) { 1.57 return true; 1.58 - } else { 1.59 - if (buf) buf[0] = '\0'; 1.60 - if (offset) *offset = -1; 1.61 - return false; 1.62 + } 1.63 } 1.64 + if (buf != NULL) buf[0] = '\0'; 1.65 + if (offset != NULL) *offset = -1; 1.66 + return false; 1.67 } 1.68 } 1.69