]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/malloctrace.cc
1 #include "malloctrace.hh"
9 MallocTracer
* g_mtracer
;
13 vector
<void*> MallocTracer::makeBacktrace()
15 void *array
[20]; //only care about last 17 functions (3 taken with tracing support)
16 size_t size
= backtrace (array
, 20);
17 return vector
<void*>(array
, array
+size
);
22 extern void *__libc_malloc(size_t size
);
23 extern void __libc_free(void* ptr
);
25 void* malloc (size_t size
)
28 void *mem
= __libc_malloc(sizeof(MallocTracer
));
29 g_mtracer
= new(mem
) MallocTracer
;
31 return g_mtracer
->malloc(size
);
43 static thread_local
bool l_active
;
44 void* MallocTracer::malloc(size_t size
)
46 void* ret
= __libc_malloc(size
);
52 d_totAllocated
+= size
;
55 std::lock_guard
<std::mutex
> lock(d_mut
);
56 auto& ent
=d_stats
[makeBacktrace()];
66 void MallocTracer::free(void* ptr
)
71 std::lock_guard
<std::mutex
> lock(d_mut
);
72 auto f
= d_sizes
.find(ptr
);
73 if(f
!= d_sizes
.end()) {
74 d_totAllocated
-= f
->second
;
81 MallocTracer::allocators_t
MallocTracer::topAllocators(int num
)
85 for(const auto& e
: d_stats
) {
86 ret
.push_back(make_pair(e
.second
, e
.first
));
88 std::sort(ret
.begin(), ret
.end(),
89 [](const allocators_t::value_type
& a
,
90 const allocators_t::value_type
& b
) {
91 return a
.first
.count
< b
.first
.count
;
94 ret
.erase(ret
.begin(), ret
.begin() + (ret
.size() - num
));
99 std::string
MallocTracer::topAllocatorsString(int num
)
102 auto raw
= topAllocators(num
);
104 std::ostringstream ret
;
105 for(const auto& e
: raw
) {
106 ret
<<"Called "<<e
.first
.count
<<" times\n";
107 for(const auto& u
: e
.first
.sizes
)
108 ret
<<u
.first
<<"b: "<<u
.second
<<" times, ";
110 char** strings
= backtrace_symbols(&e
.second
[0], e
.second
.size());
111 for(unsigned int i
=0; i
< e
.second
.size(); ++i
)
112 ret
<<strings
[i
]<<'\n';
116 string str
=ret
.str();
124 strings = backtrace_symbols (array, size); //Need -rdynamic gcc (linker) flag for this to work
126 for (i = 0; i < size; i++) //skip useless functions
127 ret+=strings[i]+string("\n");