使用 CLion 和 Valgrind 调试程序检查内存泄漏

Valgrind Memcheck 是一个用于检测内存使用问题的工具,比如泄漏、无效的内存访问、不正确的释放和引用未定义的值。CLion提供了配置Valgrind ,但不是开箱即用,需要自己安装然后配置一下,通过本文三言两语你将学会CLion 下 Valgrind 的配置。


简介

Valgrind 是一套 Linux 下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind 由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个 CPU 环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。
Valgrind 包括如下一些工具:

  • Memcheck。这是 valgrind 应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。我在项目中目前只用到了该模块,在使用数组或者 OpenCV 的 Mat 时,可以利用该工具查看内存使用是否出现问题。
  • Callgrind。它主要用来检查程序中函数调用过程中出现的问题。
  • Cachegrind。它主要用来检查程序中缓存使用出现的问题。
  • Helgrind。它主要用来检查多线程程序中出现的竞争问题。
  • Massif。它主要用来检查程序中堆栈使用中出现的问题。
  • Extension。可以利用 core 提供的功能,自己编写特定的内存调试工具。

安装Valgrind

Valgrind 的官网为 Valgrind ,我这里给出 Linux下的安装方式:

1
sudo apt-get install valgrind

安装好后输入 valgrind --version 可以查看版本号,如下图所示,我的是 3.15.0 . 输入 valgrind --help 可以查看使用帮助。 接着输入 where valgrind 查看安装位置,在CLion 中配置需要用到。

关于 CLion 如何配置 WSL 可参见 WSL | CLion (jetbrains.com)



CLion中配置 Valgrind

Settings / Preferences | Build, Execution, Deployment | Dynamic Analysis Tools | Valgrind. 下图所示的位置配置 Valgrind 的路径 /usr/bin/valgrind ,然后就大功告成。

另外也可以指定分析选项或使用默认选项,我使用的默认选项。

确保使用的是WSL进行代码的编译及运行,若没有配置WSL请参见 WSL | CLion (jetbrains.com)


CLion中使用 Valgrind

用 Valgrind memcheck 运行代码即可,一旦运行结束即可查看分析报告。

点击①使用Valgrind memcheck运行

在②处常看分析,可以双击就会出现③中的具体内存泄漏的代码

④处是我故意写的内存泄漏的代码 int* p=new int[8];

要导出结果,请单击Valgrind选项卡左窗格中的导出图标,并指定目的地 XML 文件


参考文献

Debugging your program using Valgrind and CLion on Linux | Ferran Pujol Camins

valgrind安装及使用_leonardohaig的博客-_valgrind 安装

WSL | CLion (jetbrains.com)