# HG changeset patch # User KUBOTA Yuji # Date 1384863724 -32400 # Node ID 24f77b8a62fe21a3c0d433cccac41f1476ff1fe6 # Parent fa4bbeb769a38b74911a89cc886c4d1c1615ddf1 Bug 1587: Refactor to improve the messaging and gathering the symbols. reviewed-by: yasuenag diff -r fa4bbeb769a3 -r 24f77b8a62fe agent/ChangeLog --- a/agent/ChangeLog Mon Nov 11 18:02:40 2013 +0900 +++ b/agent/ChangeLog Tue Nov 19 21:22:04 2013 +0900 @@ -1,3 +1,7 @@ +2013-11-19 KUBOTA Yuji + + * Bug 1587: Refactor to improve the messaging and gathering the symbols. + 2013-11-11 Yasumasa Suenaga * Bug 1600: Adapt to JDK-8015107 diff -r fa4bbeb769a3 -r 24f77b8a62fe agent/src/oopUtil.cpp --- a/agent/src/oopUtil.cpp Mon Nov 11 18:02:40 2013 +0900 +++ b/agent/src/oopUtil.cpp Tue Nov 19 21:22:04 2013 +0900 @@ -1634,8 +1634,9 @@ /*! * \brief Search common flag. + * \return Process result. */ -void searchCommonFlags(void) { +bool searchCommonFlags(void) { /* Search flag symbols. */ struct { @@ -1659,13 +1660,12 @@ /* Search symbol. */ tempPtr = (bool*)symFinder->findSymbol(flagList[i].symbolStr); - /* If not found symbol. */ + /* If symbol not found. */ if (unlikely(tempPtr == NULL)) { - PRINT_WARN_MSG_HEADER << "Not found java symbol." + PRINT_WARN_MSG_HEADER << "Java symbol not found." << " symbol:\"" << flagList[i].symbolStr << "\"" << NEWLINE; - /* Set dummy flag. */ - tempPtr = &dummyFalseFlag; + return false; } (*flagList[i].flagPtr) = tempPtr; @@ -1681,7 +1681,7 @@ /* Search symbol. */ tempPtr = (bool*)symFinder->findSymbol(target_sym); - /* If not found symbol. */ + /* If symbol not found. */ if (unlikely(tempPtr == NULL)) { PRINT_WARN_MSG_HEADER << target_sym << " not found." << NEWLINE; } @@ -1713,7 +1713,8 @@ incAddress(symFinder->findSymbol("_ZTV23G1RootRegionScanClosure"), 8); #endif } - + + return true; } /*! @@ -1739,7 +1740,7 @@ /* If not found "is_in_permanent" function symbol. */ if(unlikely(is_in_permanent == NULL)){ - PRINT_WARN_MSG("Not found java symbol. symbol:\"is_in_permanent\""); + PRINT_WARN_MSG("Java symbol not found. symbol:\"is_in_permanent\""); return false; } @@ -1749,7 +1750,7 @@ getObjectSize = (TJvmtiEnv_GetObjectSize)symFinder->findSymbol(SYMBOL_GETOBJCTSIZE); /* If not found "GetObjectSize" function symbol. */ if(unlikely(getObjectSize == NULL)){ - PRINT_WARN_MSG("Not found java symbol. symbol:\"GetObjectSize\""); + PRINT_WARN_MSG("Java symbol not found. symbol:\"GetObjectSize\""); return false; } @@ -1760,7 +1761,7 @@ "_ZN15java_lang_Class8as_KlassEP7oopDesc"); /* If not found "as_klassOop" function symbol. */ if(unlikely(asKlassOop == NULL)){ - PRINT_WARN_MSG("Not found java symbol. symbol:\"as_Klass\""); + PRINT_WARN_MSG("Java symbol not found. symbol:\"as_Klass\""); return false; } @@ -1772,7 +1773,7 @@ /* If not found "as_klassOop" function symbol. */ if(unlikely(asKlassOop == NULL)){ - PRINT_WARN_MSG("Not found java symbol. symbol:\"as_klassOop\""); + PRINT_WARN_MSG("Java symbol not found. symbol:\"as_klassOop\""); return false; } @@ -1782,7 +1783,7 @@ safePointState = (int*)symFinder->findSymbol("_ZN20SafepointSynchronize6_stateE"); /* If not found "_state" variable symbol. */ if (unlikely(safePointState == NULL)) { - PRINT_WARN_MSG("Not found java symbol. symbol:\"safepoint_state\""); + PRINT_WARN_MSG("Java symbol not found. symbol:\"safepoint_state\""); return false; } @@ -1804,7 +1805,7 @@ /* Search class(vtable) symbol. */ arr->vtable = (void**)symFinder->findSymbol(arr->vtableSymbol); if (unlikely(arr->vtable == NULL)) { - PRINT_WARN_MSG_HEADER << "Not found java symbol." + PRINT_WARN_MSG_HEADER << "Java symbol not found." << " symbol:\"" << arr->vtableSymbol << "\"" << NEWLINE; return false; } @@ -1812,7 +1813,7 @@ /* Search function symbol. */ arr->originalFunc = symFinder->findSymbol(arr->funcSymbol); if (unlikely(arr->originalFunc == NULL)) { - PRINT_WARN_MSG_HEADER << "Not found java symbol." + PRINT_WARN_MSG_HEADER << "Java symbol not found." << " symbol:\"" << arr->funcSymbol << "\"" << NEWLINE; return false; } @@ -1834,7 +1835,7 @@ /* If failure getting function information. */ if(unlikely(!setupOverrideFunction(funcs))){ - PRINT_WARN_MSG("Failure function overriding. func:parallel"); + PRINT_WARN_MSG("Can't override function. func:parallel"); return false; } @@ -1851,7 +1852,7 @@ /* If failure getting function information. */ if(unlikely(!setupOverrideFunction(funcs))){ - PRINT_WARN_MSG("Failure function overriding. func:par_old"); + PRINT_WARN_MSG("Can't override function. func:par_old"); return false; } @@ -1973,15 +1974,15 @@ int *intPos = NULL; intPos = (int*)symFinder->findSymbol(intSymList[i].symbol); - /* If not found integer symbol. */ + /* If integer symbol not found, search sub-symbol. */ if (unlikely(intPos == NULL)) { intPos = (int*)symFinder->findSymbol(intSymList[i].subSymbol); } - /* If not found integer symbol. */ + /* If integer symbol and sub-symbol not found. */ if (unlikely(intPos == NULL)) { - PRINT_WARN_MSG_HEADER - << "Not found java symbol. Use default value." + PRINT_DEBUG_MSG_HEADER + << "Java symbol not found, using default value instead." << " symbol:\"" << intSymList[i].symbol << "\"" << NEWLINE; } else { @@ -1994,7 +1995,7 @@ "_ZN12CMSCollector15_collectorStateE"); /* If not found "CMS_collectorState" function symbol. */ if (unlikely(CMS_collectorState == NULL)) { - PRINT_WARN_MSG("Not found java symbol. symbol:\"CollectorState\""); + PRINT_WARN_MSG("Java symbol not found. symbol:\"CollectorState\""); return false; } @@ -2002,14 +2003,14 @@ SELECT_HOOK_FUNCS(funcs, cms_new) /* If failure getting function information. */ if (unlikely(!setupOverrideFunction(funcs))) { - PRINT_WARN_MSG("Failure function overriding. func:CMS_new"); + PRINT_WARN_MSG("Can't override function. func:CMS_new"); return false; } /* If failure getting function information. */ if (unlikely(!setupOverrideFunction(cms_sweep_hook))) { - PRINT_WARN_MSG("Failure function overriding. func:CMS_sweep"); + PRINT_WARN_MSG("Can't override function. func:CMS_sweep"); return false; } @@ -2076,7 +2077,7 @@ if (unlikely(!setupOverrideFunction(funcs) || !setupOverrideFunction(g1Event_hook))) { - PRINT_WARN_MSG("Failure function overriding. func:g1"); + PRINT_WARN_MSG("Can't override function. func:g1"); return false; } @@ -2200,7 +2201,7 @@ vmScanner = new TVMStructScanner(symFinder); } catch(...){ - PRINT_WARN_MSG("Failure getting symbol information."); + PRINT_CRIT_MSG("Failure getting symbol information."); jvmti->Deallocate((unsigned char *)libPath); return false; } @@ -2211,7 +2212,7 @@ if(unlikely(isError(jvmti, jvmti->GetSystemProperty("java.vm.version", &versionStr)))){ - PRINT_WARN_MSG("Failure getting JVM version."); + PRINT_CRIT_MSG("Failure getting JVM version."); return false; } else{ @@ -2226,31 +2227,35 @@ /* If failure parse version string. */ if(unlikely(result != 3)){ - PRINT_WARN_MSG("Failure getting symbol information."); + PRINT_CRIT_MSG("Unsupported JVM version."); return false; } jvmInfo->setHSVersion(MAKE_HS_VERSION(major, minor, build)); } /* Search flag symbol in libjvm. */ - searchCommonFlags(); - + if (unlikely(!searchCommonFlags())) { + PRINT_CRIT_MSG("Failure getting java symbol information."); + return false; + } + /* Search common function symbol in libjvm. */ if(unlikely(!searchCommonFunction())){ + PRINT_CRIT_MSG("Failure getting java symbol information."); return false; } /* Create pthred key for klassOop. */ if(unlikely(pthread_key_create(&oldKlassOopKey, pThreadKeyDestructor) != 0)){ - PRINT_WARN_MSG("Failure create pthread key."); + PRINT_CRIT_MSG("Failure create pthread key."); return false; } if(*useG1){ if(unlikely(!jvmInfo->isAfterCR7046558())){ /* Heapstats agent is unsupported G1GC on JDK6. */ - PRINT_WARN_MSG("Sorry, G1GC isn't supported in this HotSpot version."); - PRINT_WARN_MSG("You should use <= 22.0-b03"); + PRINT_CRIT_MSG("Sorry, G1GC isn't supported in this HotSpot version."); + PRINT_CRIT_MSG("You should use >= 22.0-b03"); return false; } } @@ -2308,7 +2313,7 @@ /* Setup for WatcherThread. */ if(unlikely(!setupOverrideFunction(watcherThread_hook))){ - PRINT_WARN_MSG("Failure function overriding. func:WatcherThread"); + PRINT_WARN_MSG("Can't override function. func:WatcherThread"); return false; } switchOverrideFunction(watcherThread_hook, true); @@ -2316,14 +2321,14 @@ /* Setup for JVMTI. */ if (unlikely(!setupOverrideFunction(jvmti_hook))) { - PRINT_WARN_MSG("Failure function overriding. func:JVMTI"); + PRINT_WARN_MSG("Can't override function. func:JVMTI"); return false; } /* Setup for pointer adjustment. */ if(!jvmInfo->isAfterCR6964458()){ if(unlikely(!setupOverrideFunction(adj_hook))){ - PRINT_WARN_MSG("Failure function overriding. func:adj-ptr"); + PRINT_WARN_MSG("Can't override function. func:adj-ptr"); return false; } } @@ -2337,7 +2342,7 @@ /* Setup for inner GC function. */ if(unlikely(!setupOverrideFunction(innerStart_hook))){ - PRINT_WARN_MSG("Failure function overriding. func:common"); + PRINT_WARN_MSG("Can't override function. func:common"); return false; } diff -r fa4bbeb769a3 -r 24f77b8a62fe agent/src/snapShotMain.cpp --- a/agent/src/snapShotMain.cpp Mon Nov 11 18:02:40 2013 +0900 +++ b/agent/src/snapShotMain.cpp Tue Nov 19 21:22:04 2013 +0900 @@ -666,7 +666,7 @@ /* Initialize oop util. */ if (unlikely(!oopUtilInitialize(*jvmti))) { - PRINT_CRIT_MSG("Getting low level information failed!"); + PRINT_CRIT_MSG("Please check installation and version of java and debuginfo packages."); return GET_LOW_LEVEL_INFO_FAILED; } diff -r fa4bbeb769a3 -r 24f77b8a62fe agent/src/symbolFinder.cpp --- a/agent/src/symbolFinder.cpp Mon Nov 11 18:02:40 2013 +0900 +++ b/agent/src/symbolFinder.cpp Tue Nov 19 21:22:04 2013 +0900 @@ -31,6 +31,7 @@ #include #include #include +#include #include "symbolFinder.hpp" #include "util.hpp" @@ -170,7 +171,12 @@ /* Load library with bfd record. */ loadLibraryInfo(targetLibInfo.libname, &libBfdInfo); - + + /* If bfd record has the symbols, no need to search debuginfo */ + if (libBfdInfo.hasSymtab && libBfdInfo.staticSymCnt > 0 && libBfdInfo.dynSymCnt > 0) { + return true; + } + char dbgInfoPath[PATH_MAX]; dbgInfoPath[0] = '\0'; @@ -214,9 +220,15 @@ if(dbgInfoPath[0] != '\0'){ /* Load library's debuginfo with bfd record. */ - PRINT_DEBUG_MSG_HEADER << "Try to read debuginfo from " - << dbgInfoPath << NEWLINE; - loadLibraryInfo(dbgInfoPath, &debugBfdInfo); + struct stat st = {0}; + if (unlikely(stat(&(dbgInfoPath[0]), &st) != 0)) { + PRINT_WARN_MSG_HEADER << "Cannot read debuginfo from " + << dbgInfoPath << NEWLINE; + } else { + PRINT_DEBUG_MSG_HEADER << "Try to read debuginfo from " + << dbgInfoPath << NEWLINE; + loadLibraryInfo(dbgInfoPath, &debugBfdInfo); + } } if((debugBfdInfo.staticSymCnt == 0) && (debugBfdInfo.dynSymCnt == 0)){ @@ -316,7 +328,7 @@ } asymbol *syms = NULL; - + /* Create empty symbol as temporary working space. */ syms = bfd_make_empty_symbol(bfdDesc); if (unlikely(syms == NULL)) { @@ -332,6 +344,9 @@ /* Load dynamic symbols. */ libInfo->dynSymCnt = bfd_read_minisymbols(bfdDesc, 1, (void **)&libInfo->dynSyms, &libInfo->dynSymSize); + /* Check .symtab section. If there are no symbols in the BFD, + * below function returns the size of terminal Null pointer or 0 */ + libInfo->hasSymtab = (bfd_get_symtab_upper_bound(bfdDesc) > sizeof(NULL)); libInfo->workSym = syms; } diff -r fa4bbeb769a3 -r 24f77b8a62fe agent/src/symbolFinder.hpp --- a/agent/src/symbolFinder.hpp Mon Nov 11 18:02:40 2013 +0900 +++ b/agent/src/symbolFinder.hpp Tue Nov 19 21:22:04 2013 +0900 @@ -61,6 +61,7 @@ char *dynSyms; /*!< List stored dynamic symbol. */ int dynSymCnt; /*!< Count of dynamic symbols. */ unsigned int dynSymSize; /*!< Size of single dynamic symbols. */ + bool hasSymtab; /*!< Flag of BFD has .symtab section. */ asymbol *workSym; /*!< Empty symbol for working temporary. */ } TLibBFDInfo;