src/os/solaris/vm/os_solaris.cpp

changeset 2364
2d4762ec74af
parent 2314
f95d63e2154a
child 2365
54f5dd2aa1d9
     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  

mercurial