src/os/bsd/vm/os_bsd.cpp

changeset 5365
59b052799158
parent 5272
1f4355cee9a2
child 5563
c6ec0a97b30a
child 6455
438e13354adf
     1.1 --- a/src/os/bsd/vm/os_bsd.cpp	Thu Jul 04 04:03:28 2013 -0700
     1.2 +++ b/src/os/bsd/vm/os_bsd.cpp	Thu Jul 04 21:10:17 2013 -0700
     1.3 @@ -1234,12 +1234,13 @@
     1.4    Dl_info dlinfo;
     1.5  
     1.6    if (libjvm_base_addr == NULL) {
     1.7 -    dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo);
     1.8 -    libjvm_base_addr = (address)dlinfo.dli_fbase;
     1.9 +    if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
    1.10 +      libjvm_base_addr = (address)dlinfo.dli_fbase;
    1.11 +    }
    1.12      assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
    1.13    }
    1.14  
    1.15 -  if (dladdr((void *)addr, &dlinfo)) {
    1.16 +  if (dladdr((void *)addr, &dlinfo) != 0) {
    1.17      if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
    1.18    }
    1.19  
    1.20 @@ -1251,55 +1252,67 @@
    1.21  
    1.22  bool os::dll_address_to_function_name(address addr, char *buf,
    1.23                                        int buflen, int *offset) {
    1.24 +  // buf is not optional, but offset is optional
    1.25 +  assert(buf != NULL, "sanity check");
    1.26 +
    1.27    Dl_info dlinfo;
    1.28    char localbuf[MACH_MAXSYMLEN];
    1.29  
    1.30 -  // dladdr will find names of dynamic functions only, but does
    1.31 -  // it set dli_fbase with mach_header address when it "fails" ?
    1.32 -  if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) {
    1.33 -    if (buf != NULL) {
    1.34 -      if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
    1.35 +  if (dladdr((void*)addr, &dlinfo) != 0) {
    1.36 +    // see if we have a matching symbol
    1.37 +    if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
    1.38 +      if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
    1.39          jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
    1.40        }
    1.41 +      if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
    1.42 +      return true;
    1.43      }
    1.44 -    if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
    1.45 -    return true;
    1.46 -  } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) {
    1.47 -    if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
    1.48 -       buf, buflen, offset, dlinfo.dli_fname)) {
    1.49 -       return true;
    1.50 +    // no matching symbol so try for just file info
    1.51 +    if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
    1.52 +      if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
    1.53 +                          buf, buflen, offset, dlinfo.dli_fname)) {
    1.54 +         return true;
    1.55 +      }
    1.56 +    }
    1.57 +
    1.58 +    // Handle non-dynamic manually:
    1.59 +    if (dlinfo.dli_fbase != NULL &&
    1.60 +        Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset,
    1.61 +                        dlinfo.dli_fbase)) {
    1.62 +      if (!Decoder::demangle(localbuf, buf, buflen)) {
    1.63 +        jio_snprintf(buf, buflen, "%s", localbuf);
    1.64 +      }
    1.65 +      return true;
    1.66      }
    1.67    }
    1.68 -
    1.69 -  // Handle non-dymanic manually:
    1.70 -  if (dlinfo.dli_fbase != NULL &&
    1.71 -      Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, dlinfo.dli_fbase)) {
    1.72 -    if(!Decoder::demangle(localbuf, buf, buflen)) {
    1.73 -      jio_snprintf(buf, buflen, "%s", localbuf);
    1.74 +  buf[0] = '\0';
    1.75 +  if (offset != NULL) *offset = -1;
    1.76 +  return false;
    1.77 +}
    1.78 +
    1.79 +// ported from solaris version
    1.80 +bool os::dll_address_to_library_name(address addr, char* buf,
    1.81 +                                     int buflen, int* offset) {
    1.82 +  // buf is not optional, but offset is optional
    1.83 +  assert(buf != NULL, "sanity check");
    1.84 +
    1.85 +  Dl_info dlinfo;
    1.86 +
    1.87 +  if (dladdr((void*)addr, &dlinfo) != 0) {
    1.88 +    if (dlinfo.dli_fname != NULL) {
    1.89 +      jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
    1.90 +    }
    1.91 +    if (dlinfo.dli_fbase != NULL && offset != NULL) {
    1.92 +      *offset = addr - (address)dlinfo.dli_fbase;
    1.93      }
    1.94      return true;
    1.95    }
    1.96 -  if (buf != NULL) buf[0] = '\0';
    1.97 -  if (offset != NULL) *offset = -1;
    1.98 +
    1.99 +  buf[0] = '\0';
   1.100 +  if (offset) *offset = -1;
   1.101    return false;
   1.102  }
   1.103  
   1.104 -// ported from solaris version
   1.105 -bool os::dll_address_to_library_name(address addr, char* buf,
   1.106 -                                     int buflen, int* offset) {
   1.107 -  Dl_info dlinfo;
   1.108 -
   1.109 -  if (dladdr((void*)addr, &dlinfo)){
   1.110 -     if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
   1.111 -     if (offset) *offset = addr - (address)dlinfo.dli_fbase;
   1.112 -     return true;
   1.113 -  } else {
   1.114 -     if (buf) buf[0] = '\0';
   1.115 -     if (offset) *offset = -1;
   1.116 -     return false;
   1.117 -  }
   1.118 -}
   1.119 -
   1.120  // Loads .dll/.so and
   1.121  // in case of error it checks if .dll/.so was built for the
   1.122  // same architecture as Hotspot is running on
   1.123 @@ -1520,49 +1533,50 @@
   1.124  }
   1.125  
   1.126  void os::print_dll_info(outputStream *st) {
   1.127 -   st->print_cr("Dynamic libraries:");
   1.128 +  st->print_cr("Dynamic libraries:");
   1.129  #ifdef RTLD_DI_LINKMAP
   1.130 -    Dl_info dli;
   1.131 -    void *handle;
   1.132 -    Link_map *map;
   1.133 -    Link_map *p;
   1.134 -
   1.135 -    if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) {
   1.136 -        st->print_cr("Error: Cannot print dynamic libraries.");
   1.137 -        return;
   1.138 -    }
   1.139 -    handle = dlopen(dli.dli_fname, RTLD_LAZY);
   1.140 -    if (handle == NULL) {
   1.141 -        st->print_cr("Error: Cannot print dynamic libraries.");
   1.142 -        return;
   1.143 -    }
   1.144 -    dlinfo(handle, RTLD_DI_LINKMAP, &map);
   1.145 -    if (map == NULL) {
   1.146 -        st->print_cr("Error: Cannot print dynamic libraries.");
   1.147 -        return;
   1.148 -    }
   1.149 -
   1.150 -    while (map->l_prev != NULL)
   1.151 -        map = map->l_prev;
   1.152 -
   1.153 -    while (map != NULL) {
   1.154 -        st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
   1.155 -        map = map->l_next;
   1.156 -    }
   1.157 -
   1.158 -    dlclose(handle);
   1.159 +  Dl_info dli;
   1.160 +  void *handle;
   1.161 +  Link_map *map;
   1.162 +  Link_map *p;
   1.163 +
   1.164 +  if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 ||
   1.165 +      dli.dli_fname == NULL) {
   1.166 +    st->print_cr("Error: Cannot print dynamic libraries.");
   1.167 +    return;
   1.168 +  }
   1.169 +  handle = dlopen(dli.dli_fname, RTLD_LAZY);
   1.170 +  if (handle == NULL) {
   1.171 +    st->print_cr("Error: Cannot print dynamic libraries.");
   1.172 +    return;
   1.173 +  }
   1.174 +  dlinfo(handle, RTLD_DI_LINKMAP, &map);
   1.175 +  if (map == NULL) {
   1.176 +    st->print_cr("Error: Cannot print dynamic libraries.");
   1.177 +    return;
   1.178 +  }
   1.179 +
   1.180 +  while (map->l_prev != NULL)
   1.181 +    map = map->l_prev;
   1.182 +
   1.183 +  while (map != NULL) {
   1.184 +    st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
   1.185 +    map = map->l_next;
   1.186 +  }
   1.187 +
   1.188 +  dlclose(handle);
   1.189  #elif defined(__APPLE__)
   1.190 -    uint32_t count;
   1.191 -    uint32_t i;
   1.192 -
   1.193 -    count = _dyld_image_count();
   1.194 -    for (i = 1; i < count; i++) {
   1.195 -        const char *name = _dyld_get_image_name(i);
   1.196 -        intptr_t slide = _dyld_get_image_vmaddr_slide(i);
   1.197 -        st->print_cr(PTR_FORMAT " \t%s", slide, name);
   1.198 -    }
   1.199 +  uint32_t count;
   1.200 +  uint32_t i;
   1.201 +
   1.202 +  count = _dyld_image_count();
   1.203 +  for (i = 1; i < count; i++) {
   1.204 +    const char *name = _dyld_get_image_name(i);
   1.205 +    intptr_t slide = _dyld_get_image_vmaddr_slide(i);
   1.206 +    st->print_cr(PTR_FORMAT " \t%s", slide, name);
   1.207 +  }
   1.208  #else
   1.209 -   st->print_cr("Error: Cannot print dynamic libraries.");
   1.210 +  st->print_cr("Error: Cannot print dynamic libraries.");
   1.211  #endif
   1.212  }
   1.213  
   1.214 @@ -1707,8 +1721,11 @@
   1.215    bool ret = dll_address_to_library_name(
   1.216                  CAST_FROM_FN_PTR(address, os::jvm_path),
   1.217                  dli_fname, sizeof(dli_fname), NULL);
   1.218 -  assert(ret != 0, "cannot locate libjvm");
   1.219 -  char *rp = realpath(dli_fname, buf);
   1.220 +  assert(ret, "cannot locate libjvm");
   1.221 +  char *rp = NULL;
   1.222 +  if (ret && dli_fname[0] != '\0') {
   1.223 +    rp = realpath(dli_fname, buf);
   1.224 +  }
   1.225    if (rp == NULL)
   1.226      return;
   1.227  
   1.228 @@ -3747,20 +3764,20 @@
   1.229  bool os::find(address addr, outputStream* st) {
   1.230    Dl_info dlinfo;
   1.231    memset(&dlinfo, 0, sizeof(dlinfo));
   1.232 -  if (dladdr(addr, &dlinfo)) {
   1.233 +  if (dladdr(addr, &dlinfo) != 0) {
   1.234      st->print(PTR_FORMAT ": ", addr);
   1.235 -    if (dlinfo.dli_sname != NULL) {
   1.236 +    if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
   1.237        st->print("%s+%#x", dlinfo.dli_sname,
   1.238                   addr - (intptr_t)dlinfo.dli_saddr);
   1.239 -    } else if (dlinfo.dli_fname) {
   1.240 +    } else if (dlinfo.dli_fbase != NULL) {
   1.241        st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
   1.242      } else {
   1.243        st->print("<absolute address>");
   1.244      }
   1.245 -    if (dlinfo.dli_fname) {
   1.246 +    if (dlinfo.dli_fname != NULL) {
   1.247        st->print(" in %s", dlinfo.dli_fname);
   1.248      }
   1.249 -    if (dlinfo.dli_fbase) {
   1.250 +    if (dlinfo.dli_fbase != NULL) {
   1.251        st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
   1.252      }
   1.253      st->cr();
   1.254 @@ -3773,7 +3790,7 @@
   1.255        if (!lowest)  lowest = (address) dlinfo.dli_fbase;
   1.256        if (begin < lowest)  begin = lowest;
   1.257        Dl_info dlinfo2;
   1.258 -      if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr
   1.259 +      if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
   1.260            && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
   1.261          end = (address) dlinfo2.dli_saddr;
   1.262        Disassembler::decode(begin, end, st);

mercurial