Unix下C程序内存泄漏检测工具Valgrind的安装与使用详解

Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖。
Valgrind遵守GNU通用公共许可证条款,是一款自由软件。

官网
http://www.valgrind.org 
下载与安装
#wget http://www.valgrind.org/downloads/valgrind-3.8.1.tar.bz2#tar xvf valgrind-3.8.1.tar.bz2
#cd valgrind-3.8.1
#./configure --prefix=/usr/local/webserver/valgrind
#make
#make install

测试代码


代码如下:

#include <stdlib.h>
int* func(void)
{
   int* x = malloc(10 * sizeof(int));
   x[10] = 0;  //问题1: 数组下标越界
}                 
 int main(void)
{
   int* x=NULL;
   x=func();
   //free(x); 
   x=NULL;
   return 0;   //问题2: 内存没有释放
 }

编译
#gcc -g -o test test.c

内存检查
#valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test

报告:

说明
Invalid write of size 4:表示数组越界写了4字节
40 bytes in 1 blocks:表示因程序退出而发生内存泄露40字节

修复bug,重新检查提示已经没有内存泄露

文档:
Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误:

使用未初始化的内存 (Use of uninitialised memory)
使用已经释放了的内存 (Reading/writing memory after it has been free'd)
使用超过malloc分配的内存空间(Reading/writing off the end of malloc'd blocks)
对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
申请的空间是否有释放 (Memory leaks – where pointers to malloc'd blocks are lost forever)
malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)
重复free

(0)

相关推荐

  • unix 编程进程控制详细介绍

     unix 编程进程控制: fork函数 fork创建子进程,子进程是父进程的副本,会得到父进程数据空间.堆.栈的副本. 然后文件的共享这块也比较复杂,父进程和子进程各自都有文件描述符表,但是文件表示公用的(而一般两个进程,文件表是每个进程独有的),也就是说文件的偏移量是一致.一个文件在父进程中打开,在子进程中也会被打开一遍,因此如果在子进程中不使用这个文件,先要close这个文件. vfork函数 和fork函数有如下区别: 1:vfork子进程先执行,并且子进程调用exec函数 2:vfor

  • 深入Unix时间戳与C# DateTime时间类型互换的详解

    Unix时间戳最小单位是秒,开始时间为格林威治标准时间1970-01-01 00:00:00ConvertIntDateTime方法的基本思路是通过获取本地时区表示Unixk开始时间,加上Unix时间值(即过去的秒数). ConvertDateTimeInt方法的基本思路是通过刻度数差,再把刻度数转换为秒数,当然要说明的是,我这里返回的是double类型,意义上并非是真正的Unix时间戳格式.要获取真正Unix时间戳的,只获取整数部分就可以了. 复制代码 代码如下: dangranusing S

  • 深入探讨:unix多进程编程之wait()与waitpid()函数

    Wait函数和waipid函数当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数.对于这种信号的系统默认动作是忽略它.现在要知道调用wait或waitpid的进程可能会发生什么情况: 如果其所有子进程都在运行,则阻塞.如果一个子进程已经终止,正在得带的父进程获取到终止状态,则取得该子进程的终止状态立即返回.如果他没有任何子进程,则立即出错

  • PHP中UNIX时间戳和日期间的转换与计算实例

    UNIX时间戳是保存日期和时间的一种紧凑简洁的方法,是大多数UNIX系统中保存当前日期和时间的一种方法,也是在大多数计算机语言中表示日期和时间的一种标准格式.以32位整数表示格林威治标准时间,例如,使用证书11230499325表示当前时间的时间戳.UNIX时间戳是从1970年1月1日零点(UTC/GMT的午夜)开始起到当前时间所经过的秒数.1970年1月1日零点作为所有日期计算的基础,这个日期通常成为UNIX纪元. 因为UNIX时间戳是一个32位的数字格式,所以特别适用于计算机处理,例如计算两

  • FROM_UNIXTIME 格式化MYSQL时间戳函数

    函数:FROM_UNIXTIME作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示.语法:FROM_UNIXTIME(unix_timestamp,format) 返回表示 Unix 时间标记的一个字符串,根据format字符串格式化.format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符. 根据format字符串格式化date值.下列修饰符可以被用在format字符串中: %M 月名字(January--December)%W 星期

  • Linux/Unix环境下的Make和Makefile详解

    Linux/Unix环境下的Make和Makefile详解 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简

  • UNIX IP Stack 调整指南

    本文的目的是为了调整UNIX IP堆栈以更有效的防止现今多种类型的攻击,详细 描述了一些UNIX服务系统中网络服务如HTTP或者routing的推荐设置,其中系统 包括了如下不同的UNIX: A. IBM AIX 4.3.X B. Sun Solaris 7 C. Compaq Tru64 UNIX 5.X D. HP HP-UX 11.0 (research ongoing) E. Linux kernel 2.2 (tested both SuSE Linux 7.0 和 RedHat 7.

  • UNIX下的PHP环境配置,+apache

    UNIX下的PHP环境配置所需软件php-3.0.14-win32.zip php-3.0.14-win32.zip mysql-shareware-3.22.32-win.zip 所有软件均安装在/export/home/guoj/下,也可在其他目录.安装mysqlgzip -dc mysql-3.22.30.tar.gz | tar xvf-cd mysql-3.22.30./configure -prefix= /export/home/guoj/mysqlmakemake install

  • python正常时间和unix时间戳相互转换的方法

    本文实例讲述了python正常时间和unix时间戳相互转换的方法.分享给大家供大家参考.具体分析如下: 这段代码可以用来转换常规时间格式为unix时间戳,也可以将unix时间戳转换回来, 例如:1332888820 格式转换成 2012-03-28 06:53:40的形式 # -*- coding: utf-8 -*- import time def timestamp_datetime(value): format = '%Y-%m-%d %H:%M:%S' # value为传入的值为时间戳(

  • Linux/Unix环境下的make命令详解

    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难.而make工具则可自动完成编译工作,并且可以

  • UNIX 系统常用管理命令

    一. 引言UNIX系统作为一种强大的多用户分时操作系统,在越来越多的场合受到了应用,同时,对UNIX的系统管理的要求也随之越来越多,但目前的书籍对UNIX系统管理命令介绍的并不是很多.本文主要是针对UNIX系统管理员,以SUN SOLARIS 2.6 系统为例,列举了一些UNIX常用的管理命令的使用及其使用中遇到的问题和解决方法,供大家参考. 二. 常用系统管理命令介绍1. share 和 mount 命令 这是系统管理员常用的两个命令,share命令用于把本机的目录共享出来,以便其它UNIX系

随机推荐