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;