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

  • 相关阅读:
    jQuery EasyUI API 中文文档 数字框(NumberBox)
    jQuery EasyUI API 中文文档 数值微调器(NumberSpinner)
    jQuery EasyUI API 中文文档 日期时间框(DateTimeBox)
    jQuery EasyUI API 中文文档 微调器(Spinner)
    jQuery EasyUI API 中文文档 树表格(TreeGrid)
    jQuery EasyUI API 中文文档 树(Tree)
    jQuery EasyUI API 中文文档 属性表格(PropertyGrid)
    EntityFramework 数据操作
    jQuery EasyUI API 中文文档 对话框(Dialog)
    jQuery EasyUI API 中文文档 组合表格(ComboGrid)
  • 原文地址:https://www.cnblogs.com/findumars/p/6253044.html
Copyright © 2011-2022 走看看