comparison src/os/linux/vm/os_linux.cpp @ 14405:438e13354adf

Merge
author kvn
date Fri, 19 Jul 2013 13:32:53 -0700
parents f4f6ae481e1a 59b052799158
children f42f2e2a1518
comparison
equal deleted inserted replaced
14404:6cc7093e1341 14405:438e13354adf
1682 bool os::address_is_in_vm(address addr) { 1682 bool os::address_is_in_vm(address addr) {
1683 static address libjvm_base_addr; 1683 static address libjvm_base_addr;
1684 Dl_info dlinfo; 1684 Dl_info dlinfo;
1685 1685
1686 if (libjvm_base_addr == NULL) { 1686 if (libjvm_base_addr == NULL) {
1687 dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo); 1687 if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
1688 libjvm_base_addr = (address)dlinfo.dli_fbase; 1688 libjvm_base_addr = (address)dlinfo.dli_fbase;
1689 }
1689 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); 1690 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
1690 } 1691 }
1691 1692
1692 if (dladdr((void *)addr, &dlinfo)) { 1693 if (dladdr((void *)addr, &dlinfo) != 0) {
1693 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; 1694 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
1694 } 1695 }
1695 1696
1696 return false; 1697 return false;
1697 } 1698 }
1698 1699
1699 bool os::dll_address_to_function_name(address addr, char *buf, 1700 bool os::dll_address_to_function_name(address addr, char *buf,
1700 int buflen, int *offset) { 1701 int buflen, int *offset) {
1702 // buf is not optional, but offset is optional
1703 assert(buf != NULL, "sanity check");
1704
1701 Dl_info dlinfo; 1705 Dl_info dlinfo;
1702 1706
1703 if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) { 1707 if (dladdr((void*)addr, &dlinfo) != 0) {
1704 if (buf != NULL) { 1708 // see if we have a matching symbol
1705 if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { 1709 if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
1710 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
1706 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); 1711 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
1707 } 1712 }
1708 } 1713 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
1709 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; 1714 return true;
1710 return true; 1715 }
1711 } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { 1716 // no matching symbol so try for just file info
1712 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), 1717 if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
1713 buf, buflen, offset, dlinfo.dli_fname)) { 1718 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
1714 return true; 1719 buf, buflen, offset, dlinfo.dli_fname)) {
1715 } 1720 return true;
1716 } 1721 }
1717 1722 }
1718 if (buf != NULL) buf[0] = '\0'; 1723 }
1724
1725 buf[0] = '\0';
1719 if (offset != NULL) *offset = -1; 1726 if (offset != NULL) *offset = -1;
1720 return false; 1727 return false;
1721 } 1728 }
1722 1729
1723 struct _address_to_library_name { 1730 struct _address_to_library_name {
1764 return 0; 1771 return 0;
1765 } 1772 }
1766 1773
1767 bool os::dll_address_to_library_name(address addr, char* buf, 1774 bool os::dll_address_to_library_name(address addr, char* buf,
1768 int buflen, int* offset) { 1775 int buflen, int* offset) {
1776 // buf is not optional, but offset is optional
1777 assert(buf != NULL, "sanity check");
1778
1769 Dl_info dlinfo; 1779 Dl_info dlinfo;
1770 struct _address_to_library_name data; 1780 struct _address_to_library_name data;
1771 1781
1772 // There is a bug in old glibc dladdr() implementation that it could resolve 1782 // There is a bug in old glibc dladdr() implementation that it could resolve
1773 // to wrong library name if the .so file has a base address != NULL. Here 1783 // to wrong library name if the .so file has a base address != NULL. Here
1782 1792
1783 if (rslt) { 1793 if (rslt) {
1784 // buf already contains library name 1794 // buf already contains library name
1785 if (offset) *offset = addr - data.base; 1795 if (offset) *offset = addr - data.base;
1786 return true; 1796 return true;
1787 } else if (dladdr((void*)addr, &dlinfo)){ 1797 }
1788 if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); 1798 if (dladdr((void*)addr, &dlinfo) != 0) {
1789 if (offset) *offset = addr - (address)dlinfo.dli_fbase; 1799 if (dlinfo.dli_fname != NULL) {
1790 return true; 1800 jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
1791 } else { 1801 }
1792 if (buf) buf[0] = '\0'; 1802 if (dlinfo.dli_fbase != NULL && offset != NULL) {
1793 if (offset) *offset = -1; 1803 *offset = addr - (address)dlinfo.dli_fbase;
1794 return false; 1804 }
1795 } 1805 return true;
1806 }
1807
1808 buf[0] = '\0';
1809 if (offset) *offset = -1;
1810 return false;
1796 } 1811 }
1797 1812
1798 // Loads .dll/.so and 1813 // Loads .dll/.so and
1799 // in case of error it checks if .dll/.so was built for the 1814 // in case of error it checks if .dll/.so was built for the
1800 // same architecture as Hotspot is running on 1815 // same architecture as Hotspot is running on
2317 2332
2318 char dli_fname[MAXPATHLEN]; 2333 char dli_fname[MAXPATHLEN];
2319 bool ret = dll_address_to_library_name( 2334 bool ret = dll_address_to_library_name(
2320 CAST_FROM_FN_PTR(address, os::jvm_path), 2335 CAST_FROM_FN_PTR(address, os::jvm_path),
2321 dli_fname, sizeof(dli_fname), NULL); 2336 dli_fname, sizeof(dli_fname), NULL);
2322 assert(ret != 0, "cannot locate libjvm"); 2337 assert(ret, "cannot locate libjvm");
2323 char *rp = realpath(dli_fname, buf); 2338 char *rp = NULL;
2339 if (ret && dli_fname[0] != '\0') {
2340 rp = realpath(dli_fname, buf);
2341 }
2324 if (rp == NULL) 2342 if (rp == NULL)
2325 return; 2343 return;
2326 2344
2327 if (Arguments::created_by_gamma_launcher()) { 2345 if (Arguments::created_by_gamma_launcher()) {
2328 // Support for the gamma launcher. Typical value for buf is 2346 // Support for the gamma launcher. Typical value for buf is
4729 // debug support 4747 // debug support
4730 4748
4731 bool os::find(address addr, outputStream* st) { 4749 bool os::find(address addr, outputStream* st) {
4732 Dl_info dlinfo; 4750 Dl_info dlinfo;
4733 memset(&dlinfo, 0, sizeof(dlinfo)); 4751 memset(&dlinfo, 0, sizeof(dlinfo));
4734 if (dladdr(addr, &dlinfo)) { 4752 if (dladdr(addr, &dlinfo) != 0) {
4735 st->print(PTR_FORMAT ": ", addr); 4753 st->print(PTR_FORMAT ": ", addr);
4736 if (dlinfo.dli_sname != NULL) { 4754 if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
4737 st->print("%s+%#x", dlinfo.dli_sname, 4755 st->print("%s+%#x", dlinfo.dli_sname,
4738 addr - (intptr_t)dlinfo.dli_saddr); 4756 addr - (intptr_t)dlinfo.dli_saddr);
4739 } else if (dlinfo.dli_fname) { 4757 } else if (dlinfo.dli_fbase != NULL) {
4740 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); 4758 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
4741 } else { 4759 } else {
4742 st->print("<absolute address>"); 4760 st->print("<absolute address>");
4743 } 4761 }
4744 if (dlinfo.dli_fname) { 4762 if (dlinfo.dli_fname != NULL) {
4745 st->print(" in %s", dlinfo.dli_fname); 4763 st->print(" in %s", dlinfo.dli_fname);
4746 } 4764 }
4747 if (dlinfo.dli_fbase) { 4765 if (dlinfo.dli_fbase != NULL) {
4748 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); 4766 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
4749 } 4767 }
4750 st->cr(); 4768 st->cr();
4751 4769
4752 if (Verbose) { 4770 if (Verbose) {
4755 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); 4773 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size());
4756 address lowest = (address) dlinfo.dli_sname; 4774 address lowest = (address) dlinfo.dli_sname;
4757 if (!lowest) lowest = (address) dlinfo.dli_fbase; 4775 if (!lowest) lowest = (address) dlinfo.dli_fbase;
4758 if (begin < lowest) begin = lowest; 4776 if (begin < lowest) begin = lowest;
4759 Dl_info dlinfo2; 4777 Dl_info dlinfo2;
4760 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr 4778 if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
4761 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) 4779 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
4762 end = (address) dlinfo2.dli_saddr; 4780 end = (address) dlinfo2.dli_saddr;
4763 Disassembler::decode(begin, end, st); 4781 Disassembler::decode(begin, end, st);
4764 } 4782 }
4765 return true; 4783 return true;