#内存泄露# #memwatch# memwatch
MemWatch是一个开放源代码 C 语言内存错误检测工具。MemWatch支持 ANSI C,它提供结果日志纪录。
MemWatch 主页: https://www.linkdata.se/sourcecode/memwatch/
较常见的内存问题有下面几种,详细可参考:
#内存泄露# #内存检测#Linux中的常用内存问题检测工具
https://blog.****.net/xiaoting451292510/article/details/104952334
其功能如官网介绍,memwatch支持红色部分的监测.
- • memory overrun:写内存越界
- • double free:同一块内存释放两次
- • use after free:内存释放后使用
- • wild free:释放内存的参数为非法值
- • access uninitialized memory:访问未初始化内存
- • read invalid memory:读取非法内存,本质上也属于内存越界
- • memory leak:内存泄露
- • use after return:caller访问一个指针,该指针指向caller的栈内内存
- • stack overflow:栈溢出
下载,解压,编译。下载工具后, 解压查看其中主要文件为 memwatch.h与 memwatch.c,将源码编译到自身工程中即可。编译时加上-DMEMWATCH -DMW_STDIO
MemWatch的内存处理
MemWatch将所有分配的内存用0xFE填充,所以,如果你看到错误的数据是用0xFE填充的,那就是你没有初始化数据。例外是calloc(),它会直接把分配的内存用0填充。
MemWatch将所有已释放的内存用0xFD填充(zapped with 0xFD).如果你发现你使用的数据是用0xFD填充的,那你就使用的是已释放的内存。在这种情况,注意MemWatch会立即把一个"释放了的块信息"填在释放了的数据前。这个块包括关于内存在哪儿释放的信息,以可读的文本形式存放,格式为"FBI<counter>filename(line)"。如:"FBI<267>test.c(12)".使用FBI会降低free()的速度,所以默认是关闭的。使用mwFreeBufferInfo(1)开启。
为了帮助跟踪野指针的写情况,MemWatch能提供no-mans-land(NML)内存填充。no-mans-land将使用0xFC填充.当no-mans-land开启时,MemWatch转变释放的内存为NML填充状态
MemWatch初始化和结束处理
一般来说,在程序中使用MemWatch的功能,需要手动添加mwInit()进行初始化,并用对应的mwTerm()进行结束处理。
如果没有手动调用mwInit(),MemWatch能自动初始化.如果是这种情形,memwatch会使用atext()注册mwTerm()用于atexit-queue.对于使用自动初始化技术有一个告诫;如果你手动调用atexit()以进行清理工作,memwatch可能在你的程序结束前就终止。为了安全起见,请显式使用mwInit()和mwTerm().
MemWatch对C++的支持
可以将MemWatch用于C++,但是不推荐这么做。请详细阅读memwatch.h中关于对C++的支持。 将#if 0打开即可,实际效果比较差,不建议使用。
MemWatch使用时,必须将检测的文件引用#include "memwatch.h",否则将难以监测。因此,对于大工程来说几乎无法实现,一般情况下不大会使用MemWatch。