os::find(address addr, outputStream* st)
-
//Linux版(jdk7/hotspot/src/os/linux/vm/os_linux.cpp) 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) { // decode some bytes around the PC address begin = same_page(addr-40, addr); address end = same_page(addr+40, addr); 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; } return false; }