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