rt: Print alloc backtraces for bad release_alloc with RUSTRT_TRACK_ALLOCATIONS

Probably the env var should be renamed from DETAILED_LEAKS but I'm leaving
aside that breaking change for now.
This commit is contained in:
Keegan McAllister 2013-07-16 15:31:08 -07:00
parent dfa5595628
commit 2d82d9364c
2 changed files with 13 additions and 7 deletions

View File

@ -34,6 +34,14 @@ void *memory_region::get_data(alloc_header *ptr) {
return (void*)((char *)ptr + HEADER_SIZE);
}
inline void memory_region::maybe_print_backtrace(const alloc_header *header) const {
# if RUSTRT_TRACK_ALLOCATIONS >= 3
if (_detailed_leaks) {
backtrace_symbols_fd(header->bt + 1, header->btframes - 1, 2);
}
# endif
}
memory_region::memory_region(bool synchronized,
bool detailed_leaks,
bool poison_on_free) :
@ -174,13 +182,7 @@ memory_region::~memory_region() {
header->tag,
(uintptr_t) get_data(header));
++leak_count;
# if RUSTRT_TRACK_ALLOCATIONS >= 3
if (_detailed_leaks) {
backtrace_symbols_fd(header->bt + 1,
header->btframes - 1, 2);
}
# endif
maybe_print_backtrace(header);
}
}
assert(leak_count == _live_allocations);
@ -206,11 +208,13 @@ memory_region::release_alloc(void *mem) {
if (((size_t) alloc->index) >= _allocation_list.size()) {
printf("free: ptr 0x%" PRIxPTR " (%s) index %d is beyond allocation_list of size %zu\n",
(uintptr_t) get_data(alloc), alloc->tag, alloc->index, _allocation_list.size());
maybe_print_backtrace(alloc);
assert(false && "index beyond allocation_list");
}
if (_allocation_list[alloc->index] != alloc) {
printf("free: ptr 0x%" PRIxPTR " (%s) is not in allocation_list\n",
(uintptr_t) get_data(alloc), alloc->tag);
maybe_print_backtrace(alloc);
assert(false && "not in allocation_list");
}
else {

View File

@ -69,6 +69,8 @@ private:
void release_alloc(void *mem);
void claim_alloc(void *mem);
void maybe_print_backtrace(const alloc_header *) const;
private:
// private and undefined to disable copying
memory_region(const memory_region& rhs);