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

内存泄漏(即 malloc() 内存在对应的 free() 调用执行后永不被释放)和缓冲区溢出(例如对以前分配到某数组的内存进行写操作)是一些常见的问题,它们可能很难检测到。这一部分将讨论几个调试工具,它们极大地简化了检测和找出内存问题的过程

1. Memwatch简介
Memwatch是C语言的内存检测器。除了检测内存的功能外,它同样可以做其它的一些事情,而我们主要还是在于讲述它的基本功能。如果你真的想要知道所有相关的具体细节,可详细查看头文件memwatch.h以及源代码。

它使用C于处理器的功能,Memwatch使用它自己定义的功能函数取代所有在你的程序中用ANSI C定义的内存分配函数,Memwatch的内存分配函数包含了了所有的分配记录信息。

Memwatch可以在交叉编译后的目标板上运行。

2. Memwatch功能
(1) 主要有基本的内存管理函数
      -mwMalloc()
      -mwFree()
      -mwCalloc()
      -mwRealloc()
(2) MemWatch能够检测的功能包括
      -双重释放(double-free)、
      -错误释放(erroneous free)、
     -内存泄漏(unfreed memory)、
     -溢出(Overflow)、
     -下溢(Underflow)

3. 编译
    当编译时, 相让memwatch起作用, 编译是加上-DMEMWATCH

4. memwatch.log内容
    在正常操作的情况下,memwatch会创建一个名叫memwatch.log的文件。但有的时候,memwatch.log文件并不能被创建。此时,memwatch会尝试创建命名类似memwatNN.log的文件,其中NN是01到99之间的数字。如果还是失败,则没有log文件。

5. 应用实例

清单 1. 内存样本(test1.c)

#include <stdlib.h>
#include <stdio.h>
#include "memwatch.h"
int main(void)
{char *ptr1;char *ptr2;ptr1 = malloc(512);ptr2 = malloc(512);ptr2 = ptr1;free(ptr2);free(ptr1);
}

清单 1 中的代码将分配两个 512 字节的内存块,然后指向第一个内存块的指针被设定为指向第二个内存块。结果,第二个内存块的地址丢失,从而产生了内存泄漏。

现在我们编译清单 1 的 memwatch.c。下面是一个 makefile 示例:

test1

gcc -DMEMWATCH -DMW_STDIO test1.c memwatch
c -o test1

当您运行 test1 程序后,它会生成一个关于泄漏的内存的报告。清单 2 展示了示例 memwatch.log 输出文件。

清单 2. test1 memwatch.log 文件

  MEMWATCH 2.67 Copyright (C) 1992-1999 Johan Lindh
...
double-free: <4> test1.c(15), 0x80517b4 was freed from test1.c(14)
...
unfreed: <2> test1.c(11), 512 bytes at 0x80519e4
{FE FE FE FE FE FE FE FE FE FE FE FE ..............}
Memory usage statistics (global):N)umber of allocations made:     2L)argest memory usage :  1024T)otal of all alloc() calls:  1024U)nfreed bytes totals :   512

MEMWATCH 为您显示真正导致问题的行。如果您释放一个已经释放过的指针,它会告诉您。对于没有释放的内存也一样。日志结尾部分显示统计信息,包括泄漏了多少内存,使用了多少内存,以及总共分配了多少内存。

Linux内存调试工具初探-MEMWATCH相关推荐

  1. Linux 内存检测工具 memwatch的使用

    Linux 内存检测工具 memwatch的使用 官网下载memwatch的源码 推荐使用地址http://www.linkdata.se/sourcecode/memwatch/ 打开文件,新建一个 ...

  2. Linux内存管理初探

    linux内存是后台开发人员,需要深入了解的计算机资源.合理的使用内存,有助于提升机器的性能和稳定性.本文主要介绍linux内存组织结构和页面布局,内存碎片产生原因和优化算法,linux内核几种内存管 ...

  3. 别再说你不懂Linux内存管理了,10张图给你安排的明明白白!

    来自:后端技术学堂 过去的一周有点魔幻,有印象的有三个新闻:天猫总裁绯闻事件,蘑菇街裁员,不可能打工的周某也放出来了.三件事,两件和互联网行业相关,好像外面的世界很是精彩啊!吃瓜归吃瓜,学习还是不能落 ...

  4. Linux内存管理(经典)

    今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学,内存管理好像离我们很远,但这个知识点虽然冷门(估计很多人学完根本就没机会用上)但绝对是基础中的基础,这就像武侠中的内功修炼,学完 ...

  5. Linux - 内存管理

    引用文章 Linux阅马场 初探Linux内核态--通过proc文件系统作快速问题定位 linux通过meminfo 与 slab 定位内存泄漏 曾文斌: /proc/meminfo之谜完全揭秘 vm ...

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

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

  7. Linux内存泄漏检测方法总结

    Linux内存泄漏检测方法总结 一.mtrace分析内存泄露 mtrace原理 设置日志生成路径 测试实例 日志 泄露分析 使用addr2line工具定位源码位置 使用mtrace工具分析日志信息 二 ...

  8. Linux内存背后的那些神秘往事

    Linux内存背后的那些神秘往事 作者:大白斯基(公众号:后端研究所) 转自:https://mp.weixin.qq.com/s/l_YdpyHht5Ayvrc7LFZNIA 前言 大家好,我的朋友 ...

  9. linux内存管理之malloc

    对于内核的内存管理,像kmalloc,vmalloc,kmap,ioremap等比较熟悉.而对用户层的管理机制不是很熟悉,下面就从malloc的实现入手.( 这里不探讨linux系统调用的实现机制. ...

最新文章

  1. 如何选择视觉CV光源颜色
  2. JavaScript 复习之数据类型
  3. 曙光i620c20用户手册_曙光天阔I620-G20服务器技术白皮书.pdf
  4. Windows 2000配置Web服务器
  5. linux的进程与库之间的通信两种方式
  6. Kafka 的生产者优秀架构设计
  7. python面向对象:小结
  8. 2019必学的10大顶级Python库!
  9. 物体检测object detection object recognition和coco数据集 动手学深度学习v2 pytorch
  10. FME转换器 正则字符查找(StringSearcher)
  11. 成品app直播源码,实现图形验证码
  12. Word批量生成软件
  13. 正确姿势使用arm-linux-androideabi-addr2line
  14. html5类库,javascript类库有哪些?
  15. 人力资源管理数据分析
  16. 形容词,名词记忆(三):ment, ent后缀常用词
  17. 抖音下载量超 Facebook;华为新款手机陷“绿屏”门;苹果又遭起诉 | 极客头条...
  18. 关于三极管,我忽视了两点
  19. 将word 转换为图片(word to pdf ->pdf to image)
  20. air dots 配对_Redmi AirDots可以作为iphone的合格伴侣吗?

热门文章

  1. C++_类和对象_C++继承_继承中的对象模型_占内存大小---C++语言工作笔记063
  2. MFC工作笔记0011---atoi的用法
  3. C#.Net工作笔记007---关于Lst深层复制_浅层复制_提供一个方法可以直接使用
  4. resnet 25 训练人脸识别
  5. 编程范式之栈的抽象操作
  6. 提交spark任务偶尔报错 org.apache.spark.SparkException: A master URL must be set in your configuration
  7. AddLinkedServer
  8. 杭电1869六度分离
  9. BCD与ASCII码互转-C语言实现
  10. java 配置tomcat_为tomcat配置java环境变量