linux下的测试工具真是少之又少,还不好用,最近试用了memwatch,感觉网上的介绍不太好,所以放在这里跟大家分享 。其实大部分都是看的帮助,很多地方翻译得不好还有错,请原谅指出最好看原文。如果转载或引用,请注明我的博客地址,谢谢。

1 介绍

MemWatch由 Johan  Lindh 编写,是一个开放源代码 C 语言内存错误检测工具。MemWatch支持 ANSI C,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneous free)、内存泄漏(unfreed memory)、溢出(Overflow)、下溢(Underflow)等等。
1.1 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填充状态。
1.2初始化和结束处理
一般来说,在程序中使用MemWatch的功能,需要手动添加mwInit()进行初始化,并用对应的mwTerm ()进行结束处理。
当然,如果没有手动调用mwInit(),MemWatch能自动初始化.如果是这种情形,memwatch会使用atext()注册mwTerm()用于atexit-queue. 对于使用自动初始化技术有一个告诫;如果你手动调用atexit()以进行清理工作,memwatch可能在你的程序结束前就终止。为了安全起见,请显式使用mwInit()和mwTerm().
涉及的函数主要有:
mwInit()    mwTerm()    mwAbort()
1.3 MemWatch的I/O 操作
对于一般的操作,MemWatch创建memwatch.log文件。有时,该文件不能被创建;MemWatch会试图创建memwatNN.log文件,NN在01~99之间。
如果你不能使用日志,或者不想使用,也没有问题。只要使用类型为"void func(int c)"的参数调用mwSetOutFunc(),然后所有的输出都会按字节定向到该函数.
当ASSERT或者VERIFY失败时,MemWatch也有Abort/Retry/Ignore处理机制。默认的处理机制没有I/O操作,但是会自动中断程序。你可以使用任何其他Abort/Retry/Ignore的处理机制,只要以参数"void func(int c)"调用mwSetAriFunc()。后面在1.2使用一节会详细讲解。
涉及的函数主要有:
mwTrace()           mwPuts()        mwSetOutFunc()  mwSetAriFunc()
mwSetAriAction()    mwAriHandler()  mwBreakOut()
1.4 MemWatch对C++的支持
    可以将MemWatch用于C++,但是不推荐这么做。请详细阅读memwatch.h中关于对C++的支持。

2 使用

2.1 为自己的程序提供MemWatch功能
在要使用MemWatch的.c文件中包含头文件"memwatch.h"
使用GCC编译(注意:不是链接)自己的程序时,加入 -DMEMWATCH -DMW_STDIO
如:gcc -DMEMWATCH -DMW_STDIO –o test.o –c  test1.c

 

2.2 使用MemWatch提供的功能
1在程序中常用的MemWatch功能有:
*   mwTRACE ( const char* format_string, ... );
或TRACE ( const char* format_string, ... );
*   mwASSERT ( int, const char*, const char*, int )
或ASSERT ( int, const char*, const char*, int )
*   mwVERIFY ( int, const char*, const char*, int )
或VERIFY ( int, const char*, const char*, int )
*   mwPuts ( const char* text )
*   ARI 机制( mwSetAriFunc(int (*func)(const char *)),
          mwSetAriAction(int action),
          mwAriHandler ( const char* cause ))
*   mwSetOutFunc (void (*func)(int))
*   mwIsReadAddr(const void *p, unsigned len )
*   mwIsSafeAddr(void *p, unsigned len )
*   mwStatistics ( int level )
*   mwBreakOut ( const char* cause)
2mwTRACE,mwASSERT,mwVERIFY和mwPuts顾名思义,就不再赘述。仅需要注意的是,Memwatch定义了宏TRACE,    ASSERT 和 VERIFY.如果你已使用同名的宏,memwatch2.61及更高版本的memwatch不会覆盖你的定义。MemWatch2.61及以后,定义了mwTRACE, mwASSERT 和 mwVERIFY宏,这样,你就能确定使用的是memwatch的宏定义。2.61版本前的memwatch会覆盖已存在的同名的TRACE, ASSERT 和 VERIFY定义。
当然,如果你不想使用MemWatch的这几个宏定义,可以定义MW_NOTRACE, MW_NOASSERT 和 MW_NOVERIFY宏,这样MemWatch的宏定义就不起作用了。所有版本的memwatch都遵照这个规则。
3ARI机制即程序设置的“Abort, Retry, Ignore选择陷阱。
mwSetAriFunc
设置“Abort, Retry, Ignore”发生时的MemWatch调用的函数.当这样设置调用的函数地址时,实际的错误消息不会打印出来,但会作为一个参数进行传递。
如果参数传递NULL,ARI处理函数会被再次关闭。当ARI处理函数关闭后, meewatch会自动调用有mwSetAriAction()指定的操作。
正常情况下,失败的ASSERT() or VERIFY()会中断你的程序。但这可以通过mwSetAriFunc()改变,即通过将函数"int myAriFunc(const char *)"传给它实现。你的程序必须询问用户是否中断,重试或者忽略这个陷阱。返回2用于Abort, 1用于Retry,或者0对于Ignore。注意retry时,会导致表达式重新求值.
 MemWatch有个默认的ARI处理器。默认是关闭的,但你能通过调用mwDefaultAri()开启。注意这仍然会中止你的程序除非你定义MEMWATCH_STDIO允许MemWatch使用标准C的I/O流。
同时,设置ARI函数也会导致MemWatch不将ARI的错误信息写向标准错误输出,错误字符串而是作为'const char *'参数传递到ARI函数.
mwSetAriAction
如果没有ARI处理器被指定,设置默认的ARI返回值。默认是MW_ARI_ABORT
mwAriHandler
这是个标准的ARI处理器,如果你喜欢就尽管用。它将错误输出到标准错误输出,并从标准输入获得输入。
mwSetOutFunc
将输出转向调用者给出的函数(参数即函数地址)。参数为NULL,表示把输出写入日志文件memwatch.log.
mwIsReadAddr:
检查内存是否有读取的权限
mwIsSafeAddr:
检查内存是否有读、写的权限
mwStatistics:
设置状态搜集器的行为。对应的参数采用宏定义。
#define MW_STAT_GLOBAL  0       /* 仅搜集全局状态信息 */
#define MW_STAT_MODULE  1       /* 搜集模块级的状态信息 */
#define MW_STAT_LINE    2       /* 搜集代码行级的状态信息 */
#define MW_STAT_DEFAULT 0       /* 默认状态设置 */
mwBreakOut:
当某些情况MemWatch觉得中断(break into)编译器更好时,就调用这个函数.如果你喜欢使用MemWatch,那么可以在这个函数上设置执行断点。
其他功能的使用,请参考源代码的说明。

memwatch的使用(二):[url]http://brantc.blog.51cto.com/410705/118221[/url]

转载于:https://blog.51cto.com/brantc/116677

memwatch的使用(一)相关推荐

  1. memwatch内存泄露检测工具

    工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态 ...

  2. Linux内存调试工具初探-MEMWATCH

    C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权.这种自由可能会导致严重的内存管理问题,可能导致程序崩溃或随时间的推移导致性能降级. 内存泄漏(即 malloc()  ...

  3. Memwatch简介

    Memwatch简介 在三种检测工具当中,设置最简单的算是memwatch,和dmalloc一样,它能检测未释放的内存.同一段内存被释放多次.位址存取错误及不当使用未分配之内存区域.请往http:// ...

  4. Linux C 编程内存泄露检测工具(二):memwatch

    Memwatch简介 在三种检测工具当中,设置最简单的算是memwatch,和dmalloc一样,它能检测未释放的内存.同一段内存被释放多次.位址存取错误及不当使用未分配之内存区域.请往http:// ...

  5. memwatch使用笔记

    memwatch是一个用于c和c++的内存泄漏检测工具,因为我还不知道的原因,在c++里不是很好用,但是在c是绝对可用的.memwatch从网上下下来的压缩包中,主要就是两个源文件:memwatch. ...

  6. valgrind检测内存泄漏,gperftools,memwatch和性能优化Messy_Test

    yum -y install  valgrind 如何在windows使用valgrind_如何在windows下使用f2py_weixin_39621870的博客-CSDN博客 QNX下Valgri ...

  7. linux memwatch的内存检测-double-free

    1 memwatch是什么?   memwatch是C语言的内存检测器.除了检测内存的功能外,它同样可以做其它的一些事情,而我们主要还是在于讲述它的基本功能.如果你真的想要知道所有相关的具体细节,可详 ...

  8. 利用工具定位内存泄漏问题 valgrind memwatch dmalloc

    内存泄漏定位工具 内存debug有比较多的方法,首先可以参看如下的wiki,查看大概都有哪些方式,再根据其有缺点选用,适合自己需要的方式. Memory Debuggers https://elinu ...

  9. memwatch使用说明书

    memwatch使用说明书 1.memwatch是什么?     memwatch是C语言的内存检测器.除了检测内存的功能外,它同样可以做其它的一些事情,而我们主要还是在于讲述它的基本功能.如果你真的 ...

最新文章

  1. 计算机专业英语第3章,计算机专业英语教案第3章
  2. Python的filter方法实现筛选功能
  3. xos详解5:PendSV_Handler
  4. 设计模式在项目中的应用案例_项目化学习案例(五):菊花种植的秘密——项目化学习在菊种植课程中的应用设计案例...
  5. 域控制器诊断工具 (dcdiag.exe)
  6. servlet (七)javaBean
  7. poj 1191 棋盘分割(记忆化dp+递归)
  8. IOS 中description 和 debugDescription的区别
  9. Android 获取系统签名 并使用系统签名
  10. 在Codeblocks下配置GoogleTest单元测试工具
  11. 摸爬滚打DirectX11_day08——.X文件的导入
  12. MySQL 查询语句返回某字段出现超过1次的所有记录
  13. 技术资料收藏--有待整理
  14. 转简单之美——系统设计黄金法则
  15. 用了这么久的消息队列,你知道为什么需要它吗?
  16. java调用默认打印机,打印小票(80mm)
  17. 高德地图——关键字检索POI
  18. Caused by: java.lang.IllegalArgumentException: Illegal base64 character 2d
  19. "无招胜有招"nbsp;史上最全的互…
  20. spring integration 入门

热门文章

  1. margin-left:-100%理解
  2. ArabellaCPC 2019 B. Road to Arabella
  3. 液晶屏幕,OLED屏幕,反应时间计算,RT,ResponseTime,响应时间
  4. Matlab从细胞型转换为矩阵From cell to matrix
  5. matlab画图常见问题,matlab常见问题集
  6. mint系统用wine打开exe文件
  7. 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)
  8. 龙芯(mips)+麒麟V10 electron适配
  9. 宝塔同时安装苹果cms海洋cms_苹果cms用宝塔定时采集+添加百度推送教程
  10. “附近的人”功能是如何实现的?