zoukankan      html  css  js  c++  java
  • 【内存泄漏】方法三:利用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发现。

  • 相关阅读:
    Dubbo源码解析(四)之provider暴露篇
    Dubbo源码解析(六)之provider调用篇
    Dubbo源码解析(九)之consumer调用篇
    Dubbo源码解析(八)之consumer关联provider
    Dubbo源码解析(七)之consumer初始化
    Dubbo源码解析(一)之配置解析篇
    MXNet转Onnx出现错误AttributeError: No conversion function registered for op type SoftmaxActivation yet. AttributeError: No conversion function registered for op type UpSampling yet.
    druid和druid-spring-boot-starter 的区别
    AOP@Before,@After,@AfterReturning,@AfterThrowing执行顺序
    NSInvocation
  • 原文地址:https://www.cnblogs.com/baiduboy/p/13536695.html
Copyright © 2011-2022 走看看