当前位置: 首页 > news >正文

Linux内存调试工具初探-MEMWATCH

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: 2
L)argest memory usage : 1024
T)otal of all alloc() calls: 1024
U)nfreed bytes totals : 512

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

http://www.xdnf.cn/news/813997.html

相关文章:

  • GitHub和码云上,7个 h5 页面制作工具推荐
  • 11.20 《第二家园》上线内测
  • linux网络编程 copymemory,在VB6中用CopyMemory拷贝字符串的种种猫腻(一)
  • html爱心代码
  • SET QUOTED_IDENTIFIER OFF
  • 占座网失败原因分析
  • 程序员入门教程【非常详细】从零基础入门到精通,看完这一篇就够了 !
  • C#WebMVCLayui实战之《新闻管理系统》(适合初学者)
  • 服务器Hot Spare热备
  • 分页查询研究
  • 信息检索相关任务及数据集介绍
  • Android5 高级教程(三)
  • 英语词根词缀总结整合版
  • nginx配置使用笔记:三
  • 震撼!国产自研多环境开发软件 CEC-IDE 问世!遥遥领先!
  • C标准、C标准库、C++标准、C++标准库
  • 10个用于Android开发的有用的Kotlin库及示例
  • SMTP、ESMTP、POP3发送接收邮件
  • 启动应用程序出现mfc71u.dll找不到问题解决
  • PropertyGrid 用法,还没明白呢.
  • linux_i2c驱动架构(史上最全) davinc dm368 i2c驱动分析
  • 【数学建模】基于matlab模拟报童问题仿真
  • uefi和legacy的区别对比
  • C#中当程序的访问权限不足时,Directory.Exists和File.Exists方法不会抛出异常报错...
  • Windows server 2012R2下IIS服务器的配置与管理
  • 局域网电脑入侵
  • Linux---Shell(使用技巧 与 变量)
  • 事件对象
  • 使用SWFUpload上传文件
  • 【实用工具系列】MathCAD入门安装及快速上手使用教程