• 【内存泄漏】方法三:利用linux的valgrind命令定位内存泄露(Memory Leak)


    Valgrind 安装

    命令: sudo apt-get install valgrind

     转载于:https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/index.html

    Valgrind 使用

    第一步:准备好程序

    为了使valgrind发现的错误更精确,如能够定位到源代码行,建议在编译时加上-g参数,编译优化选项请选择O0,虽然这会降低程序的执行效率。

    这里用到的示例程序文件名为:sample.c(如下所示),选用的编译器为gcc。

    生成可执行程序 gcc –g –O0 sample.c –o sample

    清单 1

    清单 1

    第二步:在valgrind下,运行可执行程序。

    利用valgrind调试内存问题,不需要重新编译源程序,它的输入就是二进制的可执行程序。调用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]

    Valgrind 的参数分为两类,一类是 core 的参数,它对所有的工具都适用;另外一类就是具体某个工具如 memcheck 的参数。Valgrind 默认的工具就是 memcheck,也可以通过“--tool=tool name”指定其他的工具。Valgrind 提供了大量的参数满足你特定的调试需求,具体可参考其用户手册。

    这个例子将使用 memcheck,于是可以输入命令入下:valgrind <Path>/sample.

    第三步:分析 valgrind 的输出信息。

    以下是运行上述命令后的输出。

    清单 2

    清单 2

    • 左边显示类似行号的数字(32372)表示的是 Process ID。
    • 最上面的红色方框表示的是 valgrind 的版本信息。
    • 中间的红色方框表示 valgrind 通过运行被测试程序,发现的内存问题。通过阅读这些信息,可以发现:
      1. 这是一个对内存的非法写操作,非法写操作的内存是4 bytes。
      2. 发生错误时的函数堆栈,以及具体的源代码行号。
      3. 非法写操作的具体地址空间。
    • 最下面的红色方框是对发现的内存问题和内存泄露问题的总结。内存泄露的大小(40 bytes)也能够被检测出来。

    示例程序显然有两个问题,一是fun函数中动态申请的堆内存没有释放;二是对堆内存的访问越界。这两个问题均被valgrind发现。

  • 相关阅读:
    原生js的ajax请求
    如何将一个div水平垂直居中
    python 面向对象(进阶篇)
    Python 面向对象(初级篇)
    python 之 XML的基本应用总结
    python 之 json 与pickle 模块
    python 之configparser模块
    python 中logging模块
    python hashillb 模块
    python sys模块
  • 原文地址:https://www.cnblogs.com/baiduboy/p/13536695.html
Copyright © 2020-2023  润新知