#内存泄露# #memwatch# memwatch

MemWatch是一个开放源代码 C 语言内存错误检测工具。MemWatch支持 ANSI C,它提供结果日志纪录。

MemWatch 主页: https://www.linkdata.se/sourcecode/memwatch/

较常见的内存问题有下面几种,详细可参考:

#内存泄露# #内存检测#Linux中的常用内存问题检测工具

https://blog.csdn.net/xiaoting451292510/article/details/104952334

其功能如官网介绍,memwatch支持红色部分的监测.

  1. • memory overrun:写内存越界 
  2. • double free:同一块内存释放两次 
  3. • use after free:内存释放后使用 
  4. • wild free:释放内存的参数为非法值 
  5. • access uninitialized memory:访问未初始化内存 
  6. • read invalid memory:读取非法内存,本质上也属于内存越界 
  7. • memory leak:内存泄露 
  8. • use after return:caller访问一个指针,该指针指向caller的栈内内存 
  9. • 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().

 

MemWatchC++的支持

可以将MemWatch用于C++,但是不推荐这么做。请详细阅读memwatch.h中关于对C++的支持。 将#if 0打开即可,实际效果比较差,不建议使用。

MemWatch使用时,必须将检测的文件引用#include "memwatch.h",否则将难以监测。因此,对于大工程来说几乎无法实现,一般情况下不大会使用MemWatch。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值