linux memwatch的内存检测-double-free

时间:2024-03-09 10:41:13

1 memwatch是什么?
memwatch是C语言的内存检测器。除了检测内存的功能外,它同样可以做其它的一些事情,而我们主要还是在于讲述它的基本功能。如果你真的想要知道所有相关的具体细节,可详细查看头文件memwatch.h以及源代码。那里面有具体且详细的注释说明。
它使用C于处理器的功能,memwatch使用它自己定义的功能函数取代所有在你的程序中用ANSI C定义的内存分配函数,memwatch的内存分配函数包含了了所有的分配记录信息。
2 memwatch功能
a.它主要有基本的内存管理函数
mwMalloc()
mwFree()
mwCalloc()
mwRealloc()
b.MemWatch能够检测的功能包括
双重释放(double-free)、
错误释放(erroneous free)、
内存泄漏(unfreed memory)、
溢出(Overflow)、
下溢(Underflow)等
而目前我们只针对double-free进行了验证;
对于unfreed功能,需要在主程序结束前添加CHECK()函数进行检查,这一点嵌入式系统并不特别适用,因此,在强行关闭程序时有可能会出现大量的unfreed信息,请忽略。
使用MemWatch功能需要在待检测源文件中引用memwatch.h,若没有添加有可能出现野指针(wild-free)信息;如果申请内存时使用了malloc而释放内存时使用了mwfree接口,有可能会出现错误释放(wild-free)信息,遇到wild-free现象时请先排除以上两场景。

3 编译
当编译时, 相让memwatch起作用, 编译是加上-DMEMWATCH
4 memwatch.log内容
在正常操作的情况下,memwatch会创建一个名叫memwatch.log的文件。但有的时候,memwatch.log文件并不能被创建。此时,memwatch会尝试创建命名类似memwatNN.log的文件,其中NN是01到99之间的数字。如果还是失败,则没有log文件。
a、检测启动时间:
如:
Started at Thu Nov 1 14:56:31 2012
Started at Thu Nov 1 14:56:31 2012
b、状态搜集器的信息及宏定义信息,可忽略。
如:
__STDC__ 64-bit mwDWORD==(unsigned long
mwROUNDALLOC==8 sizeof(mwData)==32 mwDataSize==32

c、MemWatch捕获的错误信息
如:
double-free: <1385> menuChannelSet.c(529), 0x11a4130 was freed from mwTest.c(781)