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");
}
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;
}
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)
{
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" {
{
trace.fill(dlopenOriginal);
} else {
- trace.fill(2);
+ if (HeapTrack::isUnmanagedTraceNeeded())
+ trace.fill(2);
}
HeapTrack heaptrack(guard);
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);
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) {
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);
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);
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()) {
private:
TraceEdge m_root = {0, 0, {}};
uint32_t m_index = 1;
+ enum : int
+ {
+ MANAGED_MAX_SIZE = 64
+ };
};
#endif // TRACETREE_H