src/os/bsd/vm/os_bsd.cpp

Print this page

        

*** 1232,1247 **** bool os::address_is_in_vm(address addr) { static address libjvm_base_addr; Dl_info dlinfo; if (libjvm_base_addr == NULL) { ! dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo); libjvm_base_addr = (address)dlinfo.dli_fbase; assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); } ! if (dladdr((void *)addr, &dlinfo)) { if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; } return false; } --- 1232,1248 ---- bool os::address_is_in_vm(address addr) { static address libjvm_base_addr; Dl_info dlinfo; if (libjvm_base_addr == NULL) { ! if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) { libjvm_base_addr = (address)dlinfo.dli_fbase; + } assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); } ! if (dladdr((void *)addr, &dlinfo) != 0) { if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; } return false; }
*** 1249,1302 **** #define MACH_MAXSYMLEN 256 bool os::dll_address_to_function_name(address addr, char *buf, int buflen, int *offset) { Dl_info dlinfo; char localbuf[MACH_MAXSYMLEN]; ! // dladdr will find names of dynamic functions only, but does ! // it set dli_fbase with mach_header address when it "fails" ? ! if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) { ! if (buf != NULL) { ! if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); } - } if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; return true; ! } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), buf, buflen, offset, dlinfo.dli_fname)) { return true; } } ! // Handle non-dymanic manually: if (dlinfo.dli_fbase != NULL && ! Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, dlinfo.dli_fbase)) { ! if(!Decoder::demangle(localbuf, buf, buflen)) { jio_snprintf(buf, buflen, "%s", localbuf); } return true; } ! if (buf != NULL) buf[0] = '\0'; if (offset != NULL) *offset = -1; return false; } // ported from solaris version bool os::dll_address_to_library_name(address addr, char* buf, int buflen, int* offset) { Dl_info dlinfo; ! if (dladdr((void*)addr, &dlinfo)){ ! if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); ! if (offset) *offset = addr - (address)dlinfo.dli_fbase; return true; } else { ! if (buf) buf[0] = '\0'; if (offset) *offset = -1; return false; } } --- 1250,1315 ---- #define MACH_MAXSYMLEN 256 bool os::dll_address_to_function_name(address addr, char *buf, int buflen, int *offset) { + // buf is not optional, but offset is optional + assert(buf != NULL, "sanity check"); + Dl_info dlinfo; char localbuf[MACH_MAXSYMLEN]; ! if (dladdr((void*)addr, &dlinfo) != 0) { ! // see if we have a matching symbol ! if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) { ! if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); } if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; return true; ! } ! // no matching symbol so try for just file info ! if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) { if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), buf, buflen, offset, dlinfo.dli_fname)) { return true; } } ! // Handle non-dynamic manually: if (dlinfo.dli_fbase != NULL && ! Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, ! dlinfo.dli_fbase)) { ! if (!Decoder::demangle(localbuf, buf, buflen)) { jio_snprintf(buf, buflen, "%s", localbuf); } return true; } ! } ! buf[0] = '\0'; if (offset != NULL) *offset = -1; return false; } // ported from solaris version bool os::dll_address_to_library_name(address addr, char* buf, int buflen, int* offset) { + // buf is not optional, but offset is optional + assert(buf != NULL, "sanity check"); + Dl_info dlinfo; ! if (dladdr((void*)addr, &dlinfo) != 0) { ! if (dlinfo.dli_fname != NULL) { ! jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); ! } ! if (dlinfo.dli_fbase != NULL && offset != NULL) { ! *offset = addr - (address)dlinfo.dli_fbase; ! } return true; } else { ! buf[0] = '\0'; if (offset) *offset = -1; return false; } }
*** 1525,1535 **** Dl_info dli; void *handle; Link_map *map; Link_map *p; ! if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) { st->print_cr("Error: Cannot print dynamic libraries."); return; } handle = dlopen(dli.dli_fname, RTLD_LAZY); if (handle == NULL) { --- 1538,1549 ---- Dl_info dli; void *handle; Link_map *map; Link_map *p; ! if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 || ! dli.dli_fname == NULL) { st->print_cr("Error: Cannot print dynamic libraries."); return; } handle = dlopen(dli.dli_fname, RTLD_LAZY); if (handle == NULL) {
*** 1705,1716 **** char dli_fname[MAXPATHLEN]; bool ret = dll_address_to_library_name( CAST_FROM_FN_PTR(address, os::jvm_path), dli_fname, sizeof(dli_fname), NULL); ! assert(ret != 0, "cannot locate libjvm"); ! char *rp = realpath(dli_fname, buf); if (rp == NULL) return; if (Arguments::created_by_gamma_launcher()) { // Support for the gamma launcher. Typical value for buf is --- 1719,1733 ---- char dli_fname[MAXPATHLEN]; bool ret = dll_address_to_library_name( CAST_FROM_FN_PTR(address, os::jvm_path), dli_fname, sizeof(dli_fname), NULL); ! assert(ret, "cannot locate libjvm"); ! char *rp = NULL; ! if (ret && dli_fname[0] != '\0') { ! rp = realpath(dli_fname, buf); ! } if (rp == NULL) return; if (Arguments::created_by_gamma_launcher()) { // Support for the gamma launcher. Typical value for buf is
*** 3745,3768 **** // debug support bool os::find(address addr, outputStream* st) { Dl_info dlinfo; memset(&dlinfo, 0, sizeof(dlinfo)); ! if (dladdr(addr, &dlinfo)) { st->print(PTR_FORMAT ": ", addr); ! if (dlinfo.dli_sname != NULL) { st->print("%s+%#x", dlinfo.dli_sname, addr - (intptr_t)dlinfo.dli_saddr); ! } else if (dlinfo.dli_fname) { st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); } else { st->print("<absolute address>"); } ! if (dlinfo.dli_fname) { st->print(" in %s", dlinfo.dli_fname); } ! if (dlinfo.dli_fbase) { st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); } st->cr(); if (Verbose) { --- 3762,3785 ---- // debug support bool os::find(address addr, outputStream* st) { Dl_info dlinfo; memset(&dlinfo, 0, sizeof(dlinfo)); ! if (dladdr(addr, &dlinfo) != 0) { st->print(PTR_FORMAT ": ", addr); ! if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) { st->print("%s+%#x", dlinfo.dli_sname, addr - (intptr_t)dlinfo.dli_saddr); ! } else if (dlinfo.dli_fbase != NULL) { st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); } else { st->print("<absolute address>"); } ! if (dlinfo.dli_fname != NULL) { st->print(" in %s", dlinfo.dli_fname); } ! if (dlinfo.dli_fbase != NULL) { st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); } st->cr(); if (Verbose) {
*** 3771,3781 **** address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); address lowest = (address) dlinfo.dli_sname; if (!lowest) lowest = (address) dlinfo.dli_fbase; if (begin < lowest) begin = lowest; Dl_info dlinfo2; ! if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) end = (address) dlinfo2.dli_saddr; Disassembler::decode(begin, end, st); } return true; --- 3788,3798 ---- address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); address lowest = (address) dlinfo.dli_sname; if (!lowest) lowest = (address) dlinfo.dli_fbase; if (begin < lowest) begin = lowest; Dl_info dlinfo2; ! if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) end = (address) dlinfo2.dli_saddr; Disassembler::decode(begin, end, st); } return true;