使用valgrind检测python内存泄漏

问题

在运行代码时遇到了malloc():memory corruption 内存泄漏问题
使用valgrind检测python内存泄漏_第1张图片
网友说可以使用valgrind来检测,于是开始了我的摸索。

安装valgrind

  • 从官网下载valgrind安装包
  • 解压压缩包
  • 从终端进入解压后的文件夹
  • ./configure
  • make
  • make install 如果提示没有权限,则使用 sudo make install
  • 接着我们检查一下valgrind是否安装成功 valgrind --version
    在这里插入图片描述

使用valgrind检测内存泄漏

首先我们先大致了解一下valgrind中包含的几个工具:

  • memcheck:探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete调用
  • cachegrind:cache剖析器。它模拟执行CPU中的L1, D1和L2 cache,因此它能很精确的指出代码中的cache未命中
  • helgrind:查找多线程程序中的竞争数据。helgrind查找内存地址,那些被多于一条线程访问的内存地址,但是没有使用一致的锁就会被查出

为检测内存泄漏,在这里我们需要使用的是memcheck

  • 终端进入待检测文件所在的文件夹,输入
    valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --undef-value-errors=no --log-file=log ./待检测文件名
    这里因为我要检测的是py文件,因此我的输入是
    valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --undef-value-errors=no --log-file=log python ./待检测文件名.py
    在这里插入图片描述
    当然,需要先进入py文件所在的虚拟环境

  • 上一步执行完毕后即可在待检测文件所在的文件夹中生成log文件。在log文件最后会有个summary,其中对内存泄露进行了分类,总共有五类:

  • (1) “definitely lost” 意味着你的程序一定存在内存泄露;

  • (2)”indirectlylost”意味着你的程序一定存在内存泄露,并且泄露情况和指针结构相关

  • (3) “possibly lost”意味着你的程序一定存在内存泄露,除非你是故意进行着不符合常规的操作,例如将指针指向某个已分配内存块的中间位置。

  • (4) “stillreachable” 意味着你的程序可能是没问题的,但确实没有释放掉一些本可以释放的内存。这种情况是很常见的,并且通常基于合理的理由。

  • (5)”suppressed” 意味着有些泄露信息被压制了。在默认的 suppression 文件中可以看到一些 suppression相关设置。

查看发生泄露的具体位置

在log中由summary往上翻即可看到对应的错误,错误是不断细化的,
使用valgrind检测python内存泄漏_第2张图片
这样的是一个错误,先告诉你出现了多少的内存泄露,然后从最里层不断往外部函数显示:先说是calloc造成的错误,然后不断往外部函数显示。可以从下往上进行查看,比如先说main()函数发生了泄露,往上看到是main()中的init()函数,再往上init()中的init_detectionmodel,如此不断细定位泄露位置。

你可能感兴趣的:(Python学习,python,linux)