From 2d82d9364c194d0ee6c46c378dfdb4d8b04a581a Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Tue, 16 Jul 2013 15:31:08 -0700 Subject: [PATCH] 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. --- src/rt/memory_region.cpp | 18 +++++++++++------- src/rt/memory_region.h | 2 ++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/rt/memory_region.cpp b/src/rt/memory_region.cpp index 15cac3ef79b..0d58d4dae92 100644 --- a/src/rt/memory_region.cpp +++ b/src/rt/memory_region.cpp @@ -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 { diff --git a/src/rt/memory_region.h b/src/rt/memory_region.h index 4ad57c11809..b833b90d42a 100644 --- a/src/rt/memory_region.h +++ b/src/rt/memory_region.h @@ -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);