changeset 27:24f77b8a62fe

Bug 1587: Refactor to improve the messaging and gathering the symbols. reviewed-by: yasuenag
author KUBOTA Yuji <kubota.yuji@lab.ntt.co.jp>
date Tue, 19 Nov 2013 21:22:04 +0900
parents fa4bbeb769a3
children 0a4a349799b0
files agent/ChangeLog agent/src/oopUtil.cpp agent/src/snapShotMain.cpp agent/src/symbolFinder.cpp agent/src/symbolFinder.hpp
diffstat 5 files changed, 67 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- 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  <kubota.yuji@lab.ntt.co.jp>
+
+	* Bug 1587: Refactor to improve the messaging and gathering the symbols.
+
 2013-11-11  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
 	* Bug 1600: Adapt to JDK-8015107
--- 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;
   }
   
--- 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;
   }
   
--- 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 <link.h>
 #include <bfd.h>
 #include <errno.h>
+#include <sys/stat.h>
 
 #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;
 }
 
--- 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;