Loading libmemunreachable/HeapWalker.cpp +15 −1 Original line number Original line Diff line number Diff line Loading @@ -76,12 +76,14 @@ void HeapWalker::RecurseRoot(const Range& root) { Range range = to_do.back(); Range range = to_do.back(); to_do.pop_back(); to_do.pop_back(); walking_range_ = range; ForEachPtrInRange(range, [&](Range& ref_range, AllocationInfo* ref_info) { ForEachPtrInRange(range, [&](Range& ref_range, AllocationInfo* ref_info) { if (!ref_info->referenced_from_root) { if (!ref_info->referenced_from_root) { ref_info->referenced_from_root = true; ref_info->referenced_from_root = true; to_do.push_back(ref_range); to_do.push_back(ref_range); } } }); }); walking_range_ = Range{0, 0}; } } } } Loading Loading @@ -113,6 +115,10 @@ bool HeapWalker::DetectLeaks() { RecurseRoot(vals); RecurseRoot(vals); if (segv_page_count_ > 0) { MEM_ALOGE("%zu pages skipped due to segfaults", segv_page_count_); } return true; return true; } } Loading Loading @@ -168,7 +174,15 @@ void HeapWalker::HandleSegFault(ScopedSignalHandler& handler, int signal, siginf handler.reset(); handler.reset(); return; return; } } if (!segv_logged_) { MEM_ALOGW("failed to read page at %p, signal %d", si->si_addr, signal); MEM_ALOGW("failed to read page at %p, signal %d", si->si_addr, signal); if (walking_range_.begin != 0U) { MEM_ALOGW("while walking range %p-%p", reinterpret_cast<void*>(walking_range_.begin), reinterpret_cast<void*>(walking_range_.end)); } segv_logged_ = true; } segv_page_count_++; if (!MapOverPage(si->si_addr)) { if (!MapOverPage(si->si_addr)) { handler.reset(); handler.reset(); } } Loading libmemunreachable/HeapWalker.h +8 −2 Original line number Original line Diff line number Diff line Loading @@ -53,7 +53,10 @@ class HeapWalker { roots_(allocator), roots_(allocator), root_vals_(allocator), root_vals_(allocator), segv_handler_(), segv_handler_(), walking_ptr_(0) { walking_ptr_(0), walking_range_{0, 0}, segv_logged_(false), segv_page_count_(0) { valid_allocations_range_.end = 0; valid_allocations_range_.end = 0; valid_allocations_range_.begin = ~valid_allocations_range_.end; valid_allocations_range_.begin = ~valid_allocations_range_.end; Loading Loading @@ -100,7 +103,10 @@ class HeapWalker { allocator::vector<uintptr_t> root_vals_; allocator::vector<uintptr_t> root_vals_; ScopedSignalHandler segv_handler_; ScopedSignalHandler segv_handler_; uintptr_t walking_ptr_; volatile uintptr_t walking_ptr_; Range walking_range_; bool segv_logged_; size_t segv_page_count_; }; }; template <class F> template <class F> Loading Loading
libmemunreachable/HeapWalker.cpp +15 −1 Original line number Original line Diff line number Diff line Loading @@ -76,12 +76,14 @@ void HeapWalker::RecurseRoot(const Range& root) { Range range = to_do.back(); Range range = to_do.back(); to_do.pop_back(); to_do.pop_back(); walking_range_ = range; ForEachPtrInRange(range, [&](Range& ref_range, AllocationInfo* ref_info) { ForEachPtrInRange(range, [&](Range& ref_range, AllocationInfo* ref_info) { if (!ref_info->referenced_from_root) { if (!ref_info->referenced_from_root) { ref_info->referenced_from_root = true; ref_info->referenced_from_root = true; to_do.push_back(ref_range); to_do.push_back(ref_range); } } }); }); walking_range_ = Range{0, 0}; } } } } Loading Loading @@ -113,6 +115,10 @@ bool HeapWalker::DetectLeaks() { RecurseRoot(vals); RecurseRoot(vals); if (segv_page_count_ > 0) { MEM_ALOGE("%zu pages skipped due to segfaults", segv_page_count_); } return true; return true; } } Loading Loading @@ -168,7 +174,15 @@ void HeapWalker::HandleSegFault(ScopedSignalHandler& handler, int signal, siginf handler.reset(); handler.reset(); return; return; } } if (!segv_logged_) { MEM_ALOGW("failed to read page at %p, signal %d", si->si_addr, signal); MEM_ALOGW("failed to read page at %p, signal %d", si->si_addr, signal); if (walking_range_.begin != 0U) { MEM_ALOGW("while walking range %p-%p", reinterpret_cast<void*>(walking_range_.begin), reinterpret_cast<void*>(walking_range_.end)); } segv_logged_ = true; } segv_page_count_++; if (!MapOverPage(si->si_addr)) { if (!MapOverPage(si->si_addr)) { handler.reset(); handler.reset(); } } Loading
libmemunreachable/HeapWalker.h +8 −2 Original line number Original line Diff line number Diff line Loading @@ -53,7 +53,10 @@ class HeapWalker { roots_(allocator), roots_(allocator), root_vals_(allocator), root_vals_(allocator), segv_handler_(), segv_handler_(), walking_ptr_(0) { walking_ptr_(0), walking_range_{0, 0}, segv_logged_(false), segv_page_count_(0) { valid_allocations_range_.end = 0; valid_allocations_range_.end = 0; valid_allocations_range_.begin = ~valid_allocations_range_.end; valid_allocations_range_.begin = ~valid_allocations_range_.end; Loading Loading @@ -100,7 +103,10 @@ class HeapWalker { allocator::vector<uintptr_t> root_vals_; allocator::vector<uintptr_t> root_vals_; ScopedSignalHandler segv_handler_; ScopedSignalHandler segv_handler_; uintptr_t walking_ptr_; volatile uintptr_t walking_ptr_; Range walking_range_; bool segv_logged_; size_t segv_page_count_; }; }; template <class F> template <class F> Loading