TBOX 庫在調試模式下提供強大的內存檢測功能:精確定位洩漏分配點與調用棧、實時捕獲越界/重疊/雙重釋放,並對 libc 函數(strcpy、memset 等)進行插樁檢測。本文通過四類典型錯誤代碼與輸出日誌詳解檢測能力。
void tb_demo_leak() {
tb_pointer_t data = tb_malloc0(10); // 未 free
}
輸出關鍵信息:
洩漏地址、大小、補丁碼
分配點:tb_demo_leak(): 43, memory/check.c
完整調用棧:tb_fixed_pool_malloc0_ → tb_small_pool_malloc0_ → tb_pool_malloc0_ → tb_demo_leak → main → start
void tb_demo_overflow() {
tb_pointer_t data = tb_malloc0(10);
if(data) {
tb_memset(data, 0, 11); // 寫 11 字節,分配 10
tb_free(data);
}
}
輸出:
[memset]: [overflow]: [0x0 x 11] => [0x7f950b044508, 10]
調用棧定位到 tb_demo_overflow + 97
分配點信息同洩漏檢測
觸發 abort() 停止運行
void tb_demo_overlap() {
tb_pointer_t data = tb_malloc(10);
if(data) {
tb_memcpy(data, (tb_byte_t*)data + 1, 5); // src 與 dst 重疊
tb_free(data);
}
}
輸出:
[memcpy]: [overlap]: [0x7fe9b5042509, 5] => [0x7fe9b5042508, 5]
檢測到源目重疊 5 字節,觸發 abort
void tb_demo_free2() {
tb_pointer_t data = tb_malloc0(10);
if(data) {
tb_free(data);
tb_free(data); // 二次釋放
}
}
輸出:
[assert]: expr[...]: double free data: 0x7fd93386c708
斷言失敗位置:tb_static_fixed_pool_free: 612
完整分配/釋放棧雙向追蹤
0xcc 填充新分配內存,0xdd 標記已釋放,檢測未初始化/使用後釋放| 工具 | 洩漏 | 越界 | 重疊 | 雙重釋放 | 調用棧 | 性能開銷 |
|---|---|---|---|---|---|---|
| Valgrind | ✓ | ✓ | ✓ | ✓ | ✓ | 極高 (10-50x) |
| ASan | ✓ | ✓ | ✓ | ✓ | ✓ | 中 (2-3x) |
| TBOX Debug | ✓ | ✓ | ✓ | ✓ | ✓ | 低 (編譯期開關) |