MallocMonitor 使用指南
概述
MallocMonitor 是一个运行时内存调试工具,用于检测 C/C++ 程序中的内存泄漏和缓冲区溢出问题。它无需修改源代码即可透明运行。
主要特性
| 特性 | 说明 |
|---|---|
| 内存泄漏检测 | 跟踪所有内存分配,识别未释放的内存 |
| 缓冲区溢出检测 | 检测内存写入越界违规 |
| 调用栈记录 | 在分配时捕获调用栈,便于调试定位 |
| 零代码修改 | 通过链接器符号包装实现,无需修改源码 |
| C/C++ 支持 | 完全兼容 C 和 C++ 程序 |
源码位置
platform/allwinner/eyesee-mpp/middleware/{chip}/MallocMonitor
技术原理
GCC 符号包装机制
MallocMonitor 利用 GCC 的 --wrap 链接器特性来拦截内存分配函数。该机制在链接阶段将标准内存函数替换为包装版本:
+------------------+ +------------------+ +------------------+
| Application | | Linker | | MallocMonitor |
| | | --wrap flag | | |
| malloc() ----->|-------->| Redirects to -->|-------->| __wrap_malloc() |
| free() ----->| | __wrap_xxx() -->|-------->| __wrap_free() |
| realloc() ----->| | | | __wrap_realloc()|
| calloc() ----->| +------------------+ +------------------+
+------------------+
整体架构图
MallocMonitor Architecture
┌──────────────────────────────────────────────────────────────────────────────┐
│ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ Application Layer │ │
│ │ │ │
│ │ malloc() ──┐ │ │
│ │ free() ──┼──► Standard Memory API Calls │ │
│ │ realloc() ─┤ │ │
│ │ calloc() ──┘ │ │
│ └────────────────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ MallocMonitor Layer │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │ │
│ │ │ __wrap_malloc │ │ __wrap_free │ │ __wrap_realloc/calloc │ │ │
│ │ └─── ─────┬────────┘ └────────┬────────┘ └───────────┬─────────────┘ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Memory Tracking List │ │ │
│ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │
│ │ │ │ Node 1 │───►│ Node 2 │───►│ Node N │ │ │ │
│ │ │ │ • address │ │ • address │ │ • address │ │ │ │
│ │ │ │ • size │ │ • size │ │ • size │ │ │ │
│ │ │ │ • callstack│ │ • callstack│ │ • callstack│ │ │ │
│ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ System Layer │ │
│ │ Real malloc/free Implementation │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
内存分配流程
Memory Allocation Flow
│
▼
┌─────────────────────────┐
│ Application calls │
│ malloc(size) │
└───────────┬─────────────┘
│
▼
┌─────────────────────────┐
│ __wrap_malloc() │
│ intercepts the call │
└───────────┬─────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────────┐
│ Call real │ │ Capture │ │ Create tracking│
│ malloc() │ │ call stack │ │ node │
└────────────┘ └────────────┘ └───────┬────────┘
│
▼
┌─────────────────────────┐
│ Store in tracking list: │
│ • Memory address │
│ • Allocation size │
│ • Call stack trace │
└───────────┬─────────────┘
│
▼
┌─────────────────────────┐
│ Return pointer to │
│ application │
└─────────────────────────┘
内存释放流程
Memory Deallocation Flow
│
▼
┌─────────────────────────┐
│ Application calls │
│ free(ptr) │
└───────────┬─────────────┘
│
▼
┌─────────────────────────┐
│ __wrap_free() │
│ intercepts the call │
└───────────┬─────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌────────────┐ ┌────────────────┐ ┌────────────┐
│ Find node │ │ Check for │ │ Report │
│ in list │ │ buffer overflow│ │ if overflow│
└────────────┘ └────────────────┘ └────────────┘
│
▼
┌────────────────────┐
│ Remove tracking │
│ node from list │
└─────────┬──────────┘
│
▼
┌────────────────────┐
│ Call real free() │
└────────────────────┘