【转】 memwatch使用说明书
1.memwatch是什么?
memwatch是C语言的内存检测器。除了检测内存的功能外,它同样可以做其它的一些事情,而我们主要还是在于讲述它的基本功能。如果你真的想要知道所有相关的具体细节,可详细查看头文件memwatch.h以及源代码。那里面有具体且详细的注释说明。
2.如何获取最新的版本?
http://www.linkdata.se/sourcecode.html
ftp://ftp.linkdata.se/pub/memwatch/
3.它是如何工作的?
它使用C于处理器的功能,memwatch使用它自己定义的功能函数取代所有在你的程序中用ANSI C定义的内存分配函数,memwatch的内存分配函数包含了了所有的分配记录信息。
memwatch功能默认不是开启的,除非定义了MEMWATCH,否则在代码中不会跟踪相关的内存使用情况。
memwatch通常将它的数据写入到memwatch.log文件中,但它也可以被重定向。稍后,看I/O部分。
4.我们是否能在C++源码中使用?
答案是可以的,但是我们并不推荐使用。C++允许私有的类去管理自己的内存。如果处理器使用memwatch功能不恰当的话,可能会引起一些意想不到的结果。
如果你没有这样的类,或者你有但还是想测试一下memwatch的话,你可以尝试一下。
首先,在memwatch中启用支持C++的代码。如果你不能找到,可能是不应该使用。然后,在你的源代码中,在所有的头文件中包含以下的定义:
#define new mwNew
#define delete mwDelete
如此,在调用new及delete函数的时候,会被定向到memwatch中。同时,也请务必阅读所有在memwatch.h中关于支持C++的文本。
5.使用它,线程安全吗?
对此,我表示怀疑。在2.66版本中,有初步支持线程。如果你碰巧使用了Win32或者拥有线程,请定义WIN32或MW_PTHREADS来声明。
6.初始化及清除
为了能够及时的工作,memwatch需要做一些启动及初始化的工作。mwInit()初始化memwatch,而mwTerm()终止它。如果你没有自己调用mwInit()的话,memwatch也可以自动初始化。这样的话,memwatch就要使用atexit()注册mwTerm()到atexit队列中。
如果你自己使用了atexit()去作清除工作,自动初始化技术会有一个警告。memwatch可能会在程序完成前已经终止。处于安全的考虑,请使用mwInit()和mwTerm()。
在一个程序终止可控的方式下,你可能要使用mwAbort()来替代mwTerm()。mwAbort()将会停止memwatch,即使还有未处理的mwTerm()。
7.I/O操作
在正常操作的情况下,memwatch会创建一个名叫memwatch.log的文件。但有的时候,memwatch.log文件并不能被创建。此时,memwatch会尝试创建命名类似memwatNN.log的文件,其中NN是01到99之间的数字。如果还是失败,则没有log文件。
如果你不能使用log文件,或者不希望使用,不用担心,可以使用参数为“int
func(const char*)”的mwSetOutFunc()函数,这样所有的输出都会以字符的形式重定向到那里。
当使用 ASSERT或VERIFY失败时,memwatch同样拥有中止/重试/忽略处理功能。默认的处理程序没有I/O相关的操作,但会自动终止程序。你可以使用你希望的任何处理函数,仅需要将"int
func(const char*)"的地址传递给mwSetAriFunc()。更多的细节,请参考memwatch.h。
8.中止/重试/忽略宏定义
memwatch定义了中止/重试/忽略相关的宏。如果你已经使用了这些宏,memwatch2.61及以上版本也会定义宏mwTRACE,mwASSERT和mwVERIFY,所以你可以放心的使用这些。
为了确保现有这些宏定义是被保留的,你可以定义MW_NOTRACE,MW_NOASSERT和
MW_NOVERIFY。所有的memwatch版本都会遵循这些原则。
9.系统会如何变慢?
memwatch会使系统速度减慢。大的内存分配不会影响到,你可以作一些测试,但小的内存分配将使用编译器的分配功能。最坏的情况,速度变慢3-5倍。
释放的时候,更糟糕。memwatch在释放内存的时候,将会检测更多的东西。速度变慢为5-7倍,不管内存是多大。
10.应用程序的压力测试
在模拟低内存使用环境的时候可以使用mwLimit()。mwLimit()使用最大数量的字节分配,当限制被击穿的时候,分配请求将会失败,相关限制的信息将会被记录。
如果碰到一个真正的低内存情况,memwatch log文件会记录这一切。memwatch本身有一些保留内存,这样即使是在最恶劣的条件下,它也可以正常运行。
11.追踪野指针写入和其它令人讨厌的事情
野指针写入通常是使用没有初始化的指针引起的,或者是已经初始化,但指针所指向的内存已改变或者已被释放。避免该类情况最好的办法就是始终将指针初始化为NULL,在释放完内存的时候,将指针同样指向NULL。
为了帮助追踪未初始化的指针,memwatch将所有的内存赋予了一些确定的值。当分配内存的时候包含0xFE,当释放内存的时候包含0xFD。所以如果你的程序崩溃时使用memwatch而不是没有memwatch,这很可能是你没有初始化你所分配的内存,或者使用了已经被释放掉的内存区。
在这种情况下,野指针会破坏memwatch的内部数据结构。memwatch采用校验,某些数据多次备份的方式,这样也可以修复它自己的数据结构。
如果你是一个偏执的人,作为一个程序员你应该这样,你可以使用memwatch的mwIsReadAddr()和mwIsSafeAddr()两个函数来检测可访问的内存。在ANSI C系统及Win32系统下,都是可执行的。仅需要把mwASSERT()放在需要测试的地方,然后忘记它。
12.我可以帮忙吗?
好的,可以。例如,我喜欢memwatch编译时没有任何的警告及错误。如果你使用的是兼容ANSI C的编译器,且有警告或错误,如果可以的话,请给我发邮件,告诉我细节及解决这些问题的方法。
其它的事情你也可以做,如果你决定使用memwatch,请发邮件告诉我你项目的名字或URL(如果可以的话),硬件,操作系统,编译器,及使用者。接着,我会在memwatch使用者列表中更新信息。
(http://www.linkdata.se/memwatchusers.html)
13.使用memwatch的五大问题
a.当编译的时候没有使用MEMWATCH。症状:memwatch尽职尽责地禁用本身。治愈:尝试在命令行中加入-DMEMWATCH。
b.在当前目录下没有写的权限。症状:好似memwatch不能正常工作。治愈:使用mwSetOutFunc()重定向输出。
c.在所有的头文件中忘记添加memwatch.h。症状:会有"WILD free"和"unfreed"信息。治愈:确保包括了memwatch.h。
d.当使用atexit()时依靠自动初始化。症状:导致有"unfreed"和"WILD free"信息。治愈:使用Use mwInit()和mwTerm()。
e.将一个不是使用memwatch分配的指针传递给memwatch的free函数。症状:导致一个"WILD free"的错误信息。治愈:包括memwatch.h到相应的文件中,或者使用mwFree_()来释放。
作者:txgcwm
时间:2012-2-25 17:59
备注:转载请说明出处
【转】 memwatch使用说明书的更多相关文章
- memwatch内存泄露检测工具
工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态 ...
- memwatch
一.简介 memwatch可以跟踪程序中的内存泄漏和错误,能检测双重释放(double-free).错误释放(erroneous free).没有释放的内存(unfreed memory).溢出(Ov ...
- Linux内存调试工具初探-MEMWATCH
C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权.这种自由可能会导致严重的内存管理问题,可能导致程序崩溃或随时间的推移导致性能降级. 内存泄漏(即 malloc() ...
- memwatch的使用
博主的新Blog地址:http://www.brantchen.com 欢迎訪问:) linux下的測试工具真是少之又少,还不好用,近期试用了memwatch,感觉网上的介绍不太好,所以放在这里跟大家 ...
- Linux C 编程内存泄露检測工具(二):memwatch
Memwatch简单介绍 在三种检測工具其中,设置最简单的算是memwatch,和dmalloc一样,它能检測未释放的内存.同一段内存被释放多次.位址存取错误及不当使用未分配之内存区域.请往http: ...
- BOGEER博格尔YT-813码表使用说明书 (我的是YT-823)
BOGEER博格尔YT-813码表使用说明书.doc 源:http://w.gdu.me/wiki/Bike/BOGEER-YT-813.html 参数设置 首先要测量出车轮的周长,测出车轮周长后按住 ...
- Linux内存调试工具初探-MEMWATCH(转)
C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权.这种自由可能会导致严重的内存管理问题,可能导致程序崩溃或随时间的推移导致性能降级. 内存泄漏(即 malloc() ...
- COCO 数据集使用说明书
下面的代码改写自 COCO 官方 API,改写后的代码 cocoz.py 被我放置在 Xinering/cocoapi.我的主要改进有: 增加对 Windows 系统的支持: 替换 defaultdi ...
- vld,Bounds Checker,memwatch,mtrace,valgrind,debug_new几种内存泄露检测工具的比较,Valgrind Cheatsheet
概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...
随机推荐
- 【JavsScript】转载---如何成为优秀的前端
题记 做好前端 关于离职 如何成为优秀的前端 书籍推荐 博客推荐 源码阅读 去面试 14年计划 招聘信息 题记 四月前,低迷.失志踌躇不前形容自己再好不过,中途来了一次彻底的醒悟,于是我发现自己变得勤 ...
- [AngularJS] Accessing Scope from The Console
Using Angular, you can actually access the scope and other things from the console, so when you have ...
- CENTOS YUM软件源
CentOS 7.0 使用 YUM 安装 MySQL 报错 问题现象 CentOS 7.0 使用 YUM 安装 MySQL 时出现类似如下错误信息: File contains no section ...
- 信号之sigaction函数
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(或同时执行这两种操作). #include <signal.h> int sigaction( int signo, c ...
- 基于jQuery的美食时间轴焦点图插件
这是一款非常炫酷的jQuery焦点图插件,这款jQuery焦点图的特点是有一个时间轴,点击切换按钮时,时间轴会逐渐移动,时间轴上的图片也会逐渐切换.另外,在图片上方也可以放置自定义样式的文字. 在线预 ...
- 史上最详细版!java文件打包成exe,在未配置安装JDK和未配置的电脑上运行--转载
原文地址:http://funine.iteye.com/blog/2220359 (本文所有素材将在文章最后附上) 准备工具exe4j, converticon.com(用于制做.ico格式的图片) ...
- PEAR:使用PHPDoc轻松建立你的PEAR文档
对于一个开发人员,文档总是最感到头疼的事情之一.而且,很可能你对待文档会采取截然不同的2种态度: 当你使用别人的代码库的时候,最希望得到的是它的技术文档,尤其是当时间很紧,而你又不得不硬着头皮去读那些 ...
- Python xml 解析百度糯米信息
先利用爬虫利用百度糯米提供的api来采集北京当天的团购信息,保存为numi.html import xml.etree.ElementTree as ET import os class Nuomi( ...
- WPF之复杂形状控件
有的时候想将一张图片变成一个按钮.当然这里不是单纯讲图片作为按钮的背景. 这两者是有区别的: 前者图片即按钮,比如你有一个空心的圆圈,当你点击中间空心部分的时候是没有任何反应的因为它不是属于按钮的一部 ...
- XACML-<Target> 元素的结构与相关的评估
本文由@呆代待殆原创,转载请注明出处. 一.<Target>元素的结构 <Target>元素标识的父元素被用于评估决定请求.<Target>元素即可以做为<P ...