src/os/linux/vm/os_linux.cpp

Print this page




1716     if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
1717   }
1718 
1719   return false;
1720 }
1721 
1722 bool os::dll_address_to_function_name(address addr, char *buf,
1723                                       int buflen, int *offset) {
1724   Dl_info dlinfo;
1725 
1726   if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) {
1727     if (buf != NULL) {
1728       if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
1729         jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
1730       }
1731     }
1732     if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
1733     return true;
1734   } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) {
1735     if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
1736        dlinfo.dli_fname, buf, buflen, offset) == Decoder::no_error) {
1737        return true;
1738     }
1739   }
1740 
1741   if (buf != NULL) buf[0] = '\0';
1742   if (offset != NULL) *offset = -1;
1743   return false;
1744 }
1745 
1746 struct _address_to_library_name {
1747   address addr;          // input : memory address
1748   size_t  buflen;        //         size of fname
1749   char*   fname;         // output: library name
1750   address base;          //         library base addr
1751 };
1752 
1753 static int address_to_library_name_callback(struct dl_phdr_info *info,
1754                                             size_t size, void *data) {
1755   int i;
1756   bool found = false;




1716     if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
1717   }
1718 
1719   return false;
1720 }
1721 
1722 bool os::dll_address_to_function_name(address addr, char *buf,
1723                                       int buflen, int *offset) {
1724   Dl_info dlinfo;
1725 
1726   if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) {
1727     if (buf != NULL) {
1728       if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
1729         jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
1730       }
1731     }
1732     if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
1733     return true;
1734   } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) {
1735     if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
1736        buf, buflen, offset, dlinfo.dli_fname)) {
1737        return true;
1738     }
1739   }
1740 
1741   if (buf != NULL) buf[0] = '\0';
1742   if (offset != NULL) *offset = -1;
1743   return false;
1744 }
1745 
1746 struct _address_to_library_name {
1747   address addr;          // input : memory address
1748   size_t  buflen;        //         size of fname
1749   char*   fname;         // output: library name
1750   address base;          //         library base addr
1751 };
1752 
1753 static int address_to_library_name_callback(struct dl_phdr_info *info,
1754                                             size_t size, void *data) {
1755   int i;
1756   bool found = false;