Introduce the "managed mode" to disable slow native backtraces
authorMaria Guseva <m.guseva@samsung.com>
Fri, 18 May 2018 16:07:01 +0000 (19:07 +0300)
committerAndrey Kvochko/SRR-AI Ecosystem Lab/./삼성전자 <a.kvochko@samsung.com>
Mon, 21 May 2018 15:56:56 +0000 (18:56 +0300)
src/track/libheaptrack.cpp
src/track/tracetree.h

index 84901a1543aeb28b85cfee3dd8e31ebc3cba6625..99f6499f1fa2bd6b6712059b0fca779a98bca6bf 100644 (file)
@@ -252,6 +252,10 @@ public:
             debugLog<MinimalOutput>("%s", "calling initAfterCallback done");
         }
 
+        // initialize managed mode
+        // TODO: make it user-defined, e.g. via enviroment variable
+        is_managed_mode = true;
+
         debugLog<MinimalOutput>("%s", "initialization done");
     }
 
@@ -302,7 +306,7 @@ public:
 
     void writeSMAPS(HeapTrack &heaptrack)
     {
-        if (!s_data || !s_data->out || !s_data->procSmaps) {
+        if (is_managed_mode || !s_data || !s_data->out || !s_data->procSmaps) {
             return;
         }
 
@@ -559,6 +563,11 @@ public:
         TraceTree::knownNames.insert(classId);
     }
 
+    static bool isUnmanagedTraceNeeded()
+    {
+        return !is_managed_mode;
+    }
+
 private:
     static int dl_iterate_phdr_callback(struct dl_phdr_info* info, size_t /*size*/, void* data)
     {
@@ -813,11 +822,14 @@ private:
     static LockedData* s_data;
 
     static size_t k_pageSize;
+    static bool is_managed_mode;
 };
 
 atomic<bool> HeapTrack::s_locked{false};
 HeapTrack::LockedData* HeapTrack::s_data{nullptr};
 size_t HeapTrack::k_pageSize{0u};
+bool HeapTrack::is_managed_mode{false};
+
 }
 extern "C" {
 
@@ -863,7 +875,8 @@ void heaptrack_dlopen(const vector<pair<void *, tuple<size_t, int, int>>> &newMm
         {
             trace.fill(dlopenOriginal);
         } else {
-            trace.fill(2);
+            if (HeapTrack::isUnmanagedTraceNeeded())
+                trace.fill(2);
         }
 
         HeapTrack heaptrack(guard);
@@ -897,7 +910,8 @@ void heaptrack_malloc(void* ptr, size_t size)
         debugLog<VeryVerboseOutput>("heaptrack_malloc(%p, %zu)", ptr, size);
 
         Trace trace;
-        trace.fill(2);
+        if (HeapTrack::isUnmanagedTraceNeeded())
+            trace.fill(2);
 
         HeapTrack heaptrack(guard);
         heaptrack.handleMalloc(ptr, size, trace);
@@ -925,7 +939,8 @@ void heaptrack_realloc(void* ptr_in, size_t size, void* ptr_out)
         debugLog<VeryVerboseOutput>("heaptrack_realloc(%p, %zu, %p)", ptr_in, size, ptr_out);
 
         Trace trace;
-        trace.fill(2);
+        if (HeapTrack::isUnmanagedTraceNeeded())
+            trace.fill(2);
 
         HeapTrack heaptrack(guard);
         if (ptr_in) {
@@ -945,7 +960,8 @@ void heaptrack_mmap(void* ptr, size_t length, int prot, int flags, int fd, off64
                                     ptr, length, prot, flags, fd, offset);
 
         Trace trace;
-        trace.fill(2);
+        if (HeapTrack::isUnmanagedTraceNeeded())
+            trace.fill(2);
 
         HeapTrack heaptrack(guard);
         heaptrack.handleMmap(ptr, length, prot, 0, fd, trace);
@@ -972,7 +988,8 @@ void heaptrack_objectallocate(void *objectId, unsigned long objectSize) {
     debugLog<VeryVerboseOutput>("handleObjectAllocation: %p %lu", objectId, objectSize);
 
     Trace trace;
-    trace.fill(2);
+    if (HeapTrack::isUnmanagedTraceNeeded())
+        trace.fill(2);
 
     HeapTrack heaptrack(guard);
     heaptrack.handleObjectAllocation(objectId, objectSize, trace);
index e80d40b4a9d958dc68be1cb2219c71a5ec362856..81e9df7391c17fd3b316c5dc9d61ec201c2984b8 100644 (file)
@@ -90,12 +90,12 @@ public:
         StackEntry *stackIter = g_shadowStack;
 
         if (stackIter != nullptr) {
-            void* managedStack[Trace::MAX_SIZE];
+            void* managedStack[MANAGED_MAX_SIZE];
             int managedStackSize = 0;
 
             handleIP((void *) (uintptr_t) -1, false);
 
-            while (stackIter != nullptr && managedStackSize < Trace::MAX_SIZE) {
+            while (stackIter != nullptr && managedStackSize < MANAGED_MAX_SIZE) {
                 void *ip = reinterpret_cast<void *>(stackIter->m_funcId);
 
                 if (knownNames.find(ip) == knownNames.end()) {
@@ -143,6 +143,10 @@ public:
 private:
     TraceEdge m_root = {0, 0, {}};
     uint32_t m_index = 1;
+    enum : int
+    {
+        MANAGED_MAX_SIZE = 64
+    };
 };
 
 #endif // TRACETREE_H