 +      printf_stderr("%s",ss.str().c_str());
 +    }
 +  }
-+#else
-+  template<class Key, class Value>
-+  void printInternal(const std::unordered_map<Key, Value> aMap, const char* const aObjName)
-+  {
-+    for (auto& pair : aMap)
-+    {
-+      std::ostringstream ss;
-+      ss << aObjName << "[" << pair.first << ", " << pair.second << "]\n";
-+      printf_stderr("%s",ss.str().c_str());
-+    }
-+  }
-+#endif
++
 +  // For std string
 +  void printInternal(std::string aStdStr, const char* const aObjName)
 +  {

+  void printInternal(const std::vector<uint8_t>& aVec, const char* const aObjName)
+  {
+    auto hexString = bin2hex(aVec);
+    printf_stderr("%s = %s, unsgined vector length = %" PRIu64, aObjName, hexString.c_str(), aVec.size());
+  }
+
+  template<>
+  void printInternal(const std::vector<char>& aVec, const char* const aObjName)
+  {
+    auto hexString = bin2hex(aVec);
+    printf_stderr("%s = %s, signed vector length = %" PRIu64, aObjName, hexString.c_str(), aVec.size());
+  }
+
+  template<class Key, class Value>

+      printf_stderr("%s",ss.str().c_str());
+    }
+  }
+
+  template<class Key, class Value>
+  void printInternal(const std::unordered_map<Key, Value> aMap, const char* const aObjName)
+  {
