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);