zoukankan      html  css  js  c++  java
  • Valgrind 3.11.0编译安装

    Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
    Valgrind遵守GNU通用公共许可证条款,是一款自由软件。
    到3.3.0版本为止,Valgrind支持x86、x86-64以及PowerPC上的Linux。除此之外,还有一些其它非正式支持的类Unix平台(如FreeBSD、NetBSD以及Mac OS X)。

    1、下载Valgrind 3.11.0

    直接下载源码包

    wget http://valgrind.org/downloads/valgrind-3.11.0.tar.bz2
    tar -xjvf valgrind-3.11.0.tar.bz2 
    cd valgrind-3.11.0/
    

    使用svn克隆一个

    svn co svn://svn.valgrind.org/valgrind/trunk valgrind
    

    2、生成Makefile并使用它进行编译

    生成Makefile的步骤在README这个文件中有写。

      1. 运行./autogen.sh来设置环境(你需要标准的autoconf工具)
        这个脚本其实是调用的aclocal autoheader automake autoconf,所以必须先安装好它,如果没有安装,在运行这个脚本的时候会提示你的。
      1. 运行./configure来生成Makefile文件
        这里你可以使用./configure --help来查看可以使用哪些参数设置。
        一般设置好安装路径即可./configure --prefix=/usr/local/valgrind
      1. 运行make进行编译,运行make install进行安装。

    下面是我编译时候的步骤

    复制代码
    #运行 autogen.sh
     o@o-pc:~/software/valgrind-3.11.0$ ./autogen.sh 
    running: aclocal
    running: autoheader
    running: automake -a
    running: autoconf
    
    #运行configure
    o@o-pc:~/software/valgrind-3.11.0$ ./configure --prefix=/usr/local/valgrind
    checking for a BSD-compatible install... /usr/bin/install -c
       ....  .....
    config.status: executing depfiles commands
    
             Maximum build arch: amd64
             Primary build arch: amd64
           Secondary build arch: x86
                       Build OS: linux
       ...  ...
    
    #运行make
    
    o@o-pc:~/software/valgrind-3.11.0$ make
    echo "# This is a generated file, composed of the following suppression rules:" > default.supp
    echo "# " exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp  >> default.supp
    cat exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp >> default.supp
    make  all-recursive
    ... ...
    #运行make install
    o@o-pc:~/software/valgrind-3.11.0$ sudo make install
    [sudo] o 的密码: 
    make  install-recursive
    ... ...
    复制代码

    3、测试一下
    编译完成之后可以测试一下。
    因为上面编译安装的时候指定了安装目录,所以还需要把valgrindbin目录路径添加到环境变量PATH中。否则只能使用全路径来运行valgrind
    这里我把它写入到~/.bashrc文件中。打开~/.bashrc文件,然后在最后添加一行PATH=${PATH}:/usr/local/valgrind/bin,之后使用source ~/.bashrc来更新一下。

    真的测试一下哦(这是README里面给出的测试命令)

    复制代码
    o@o-pc:~/software$ valgrind ls -l
    ==4504== Memcheck, a memory error detector
    ==4504== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
    ==4504== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
    ==4504== Command: ls -l
    ==4504== 
    总用量 11636
    drwxrwxr-x 26 o o     4096 12月 29 11:11 valgrind-3.11.0
    -rw-rw-r--  1 o o 11910809  9月 23 18:53 valgrind-3.11.0.tar.bz2
    ==4504== 
    ==4504== HEAP SUMMARY:
    ==4504==     in use at exit: 19,436 bytes in 8 blocks
    ==4504==   total heap usage: 205 allocs, 197 frees, 86,286 bytes allocated
    ==4504== 
    ==4504== LEAK SUMMARY:
    ==4504==    definitely lost: 0 bytes in 0 blocks
    ==4504==    indirectly lost: 0 bytes in 0 blocks
    ==4504==      possibly lost: 0 bytes in 0 blocks
    ==4504==    still reachable: 19,436 bytes in 8 blocks
    ==4504==         suppressed: 0 bytes in 0 blocks
    ==4504== Rerun with --leak-check=full to see details of leaked memory
    ==4504== 
    ==4504== For counts of detected and suppressed errors, rerun with: -v
    ==4504== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)
    复制代码

    自己写一个内存访问越界和泄露的小例子来测试一下

    复制代码
    #include <stdlib.h>
    int main()
    {
        ((char*)malloc(10))[10] = 100;
        return 0;
    }
    复制代码

    使用下面的命令来检查

     valgrind --track-fds=yes --leak-check=full --undef-value-errors=yes  ./test 
    

    检查结果

    复制代码
    ==4842== Memcheck, a memory error detector
    ==4842== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
    ==4842== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
    ==4842== Command: ./test
    ==4842== 
    ==4842== Invalid write of size 1   # 这里检测到了内存越界访问
    ==4842==    at 0x400548: main (in /home/o/software/test)
    ==4842==  Address 0x520204a is 0 bytes after a block of size 10 alloc'd
    ==4842==    at 0x4C2BC50: malloc (vg_replace_malloc.c:299)
    ==4842==    by 0x400543: main (in /home/o/software/test)
    ==4842== 
    ==4842== 
    ==4842== FILE DESCRIPTORS: 3 open at exit.    #打开了三个文件描述符(标准输入输出错误)
    ==4842== Open file descriptor 2: /dev/pts/12
    ==4842==    <inherited from parent>
    ==4842== 
    ==4842== Open file descriptor 1: /dev/pts/12
    ==4842==    <inherited from parent>
    ==4842== 
    ==4842== Open file descriptor 0: /dev/pts/12
    ==4842==    <inherited from parent>
    ==4842== 
    ==4842== 
    ==4842== HEAP SUMMARY:   #堆使用摘要
    ==4842==     in use at exit: 10 bytes in 1 blocks
    ==4842==   total heap usage: 1 allocs, 0 frees, 10 bytes allocated #申请/释放详情
    ==4842== 
    ==4842== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1
    ==4842==    at 0x4C2BC50: malloc (vg_replace_malloc.c:299)
    ==4842==    by 0x400543: main (in /home/o/software/test)
    ==4842== 
    ==4842== LEAK SUMMARY:   泄露摘要
    ==4842==    definitely lost: 10 bytes in 1 blocks
    ==4842==    indirectly lost: 0 bytes in 0 blocks
    ==4842==      possibly lost: 0 bytes in 0 blocks
    ==4842==    still reachable: 0 bytes in 0 blocks
    ==4842==         suppressed: 0 bytes in 0 blocks
    ==4842== 
    ==4842== For counts of detected and suppressed errors, rerun with: -v
    ==4842== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 1 from 1)
    复制代码

    可以看出上面检测到了内存越界访问和内存泄露。
    一般写玩程序后都可以使用valgrind来检测一下,避免内存泄露的问题(还有文件打开情况)

    http://www.cnblogs.com/oloroso/p/5085202.html

  • 相关阅读:
    UDP案例_在线咨询
    MFC对话框水平和垂直滚动条功能
    对话框中滚动条
    ON_COMMAND_RANGE 多个按钮响应一个函数
    char**赋值
    MFC如何使dialog对话框置顶
    如何让CListBox控件滚动条自动向下滚动?
    不带,以及带参数,带返回值的Lambda表达式
    JAVA学习_多线程技术
    最烦有些技术帖上来就放代码
  • 原文地址:https://www.cnblogs.com/findumars/p/6253044.html
Copyright © 2011-2022 走看看