目前业界有提供了一些工具来检查c++的内存问题并符号化(泄漏,野指针等等),Google Sanitizer(Google基于Clang的子项目)、Valgrind。Clion也将这些工具集成了进来,如下为Mac平台下的使用过程:
平台:MacOS 14.0。
1、Google Sanitizer
可以实现内存泄漏检测,内存使用错误等等符号化功能。由于XCode自带的clang不包含这些功能,所以需要单独进行编译llvm,这里通过brew安装llvm
- 安装llvm
brew install llvm
xcode-select --install
brew info llvm
Next-gen compiler infrastructure
https://llvm.org/
/usr/local/Cellar/llvm/17.0.6 (7,207 files, 1.8GB)
Poured from bottle using the formulae.brew.sh API on 2023-12-08 at 11:43:07
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/l/llvm.rb
License: Apache-2.0 with LLVM-exception
备注:一定要安装xcode-select --install,否则调用clang进行编译时会各种找不到头文件
- 配置Clion
添加Clion环境变量-DABS_OPEN_SANITIZER=1,将打开内存使用错误和符号化的功能。
如果还要开启内存泄漏检测同时需要在Clion中添加detect_leaks=1,如下截图:
- 使用
1、对于内存使用错误,例如多次释放、野指针、溢出等等问题,运行阶段既可以检测出来,比如有如下一段代码,运行后可以检测到有内存溢出的问题
int global_array[100] = {-1};
int main(int argc, char **argv) {
return global_array[argc + 100]; // global buffer overflow
}
2、对于内存泄漏,需要退出程序后可以检测出来。以我们自己Qt项目为例,初步用了一下,发现有几处泄漏
总体来说这个工具检测内存问题应该可以作为参考,实际效果应该还需要看后续的具体使用和继续深入研究
1、Valgrind
同样也可以实现内存泄漏检测,内存使用错误等等符号化功能。不过根据官网手册,它不支持M1架构Mac。
- 安装
xcode-select --install
brew tap LouisBrunner/valgrind
brew install --HEAD LouisBrunner/valgrind/valgrind
- Clion配置
/usr/local/bin/valgrind填入下面字段
点击OK后 然后就可以使用该工具了。
[图片上传失败...(image-94906c-1708673224246)]
目前还不支持MacOS14系统。不能与Google Sanitizer 同时使用
参考文档
https://www.jetbrains.com/help/clion/google-sanitizers.html#clang-cl-configure