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 │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘