Add better free tracking.
Included in this change:
- Change the tag when a pointer is freed so it's easy to detect if
an already freed pointer is being used.
- Move the free backtrace out of the header. This backtrace is only
used under only some circumstances, so no need to allocate space
in all headers for it.
- Add new option free_track_backtrace_num_frames to specify how many
frames to record when the free occurs. This removes the dependency
on the backtrace option to get backtraces.
Bug: 26739265
Change-Id: I76f5209507dcf46af67ada162a7cb2bf282116f2
diff --git a/libc/malloc_debug/FreeTrackData.h b/libc/malloc_debug/FreeTrackData.h
index 5888a0e..804b5a6 100644
--- a/libc/malloc_debug/FreeTrackData.h
+++ b/libc/malloc_debug/FreeTrackData.h
@@ -33,6 +33,7 @@
#include <pthread.h>
#include <deque>
+#include <unordered_map>
#include <vector>
#include <private/bionic_macros.h>
@@ -41,6 +42,7 @@
struct Header;
class DebugData;
struct Config;
+struct BacktraceHeader;
class FreeTrackData {
public:
@@ -51,6 +53,8 @@
void VerifyAll(DebugData& debug);
+ void LogBacktrace(const Header* header);
+
private:
void LogFreeError(DebugData& debug, const Header* header, const uint8_t* pointer);
void VerifyAndFree(DebugData& debug, const Header* header, const void* pointer);
@@ -58,6 +62,8 @@
pthread_mutex_t mutex_ = PTHREAD_MUTEX_INITIALIZER;
std::deque<const Header*> list_;
std::vector<uint8_t> cmp_mem_;
+ std::unordered_map<const Header*, BacktraceHeader*> backtraces_;
+ size_t backtrace_num_frames_;
DISALLOW_COPY_AND_ASSIGN(FreeTrackData);
};