在运行代码时遇到了malloc():memory corruption 内存泄漏问题
网友说可以使用valgrind来检测,于是开始了我的摸索。
- 从官网下载valgrind安装包
- 解压压缩包
- 从终端进入解压后的文件夹
- ./configure
- make
- make install 如果提示没有权限,则使用 sudo make install
- 接着我们检查一下valgrind是否安装成功 valgrind --version
首先我们先大致了解一下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往上翻即可看到对应的错误,错误是不断细化的,
这样的是一个错误,先告诉你出现了多少的内存泄露,然后从最里层不断往外部函数显示:先说是calloc造成的错误,然后不断往外部函数显示。可以从下往上进行查看,比如先说main()函数发生了泄露,往上看到是main()中的init()函数,再往上init()中的init_detectionmodel,如此不断细定位泄露位置。



