我正在尝试在macOS上检测C(和C ++)程序中的内存泄漏。在Linux和Windows上,我可以使用valgrind
轻松地执行此操作,但不幸的是,在macOS上无法使用。
由于我具有ObjC和iOS开发的背景经验,我想使用Instruments进行内存泄漏检查。乍一看,它似乎非常适合这项工作。
我编写了这个非常简单的泄漏程序:
#include <stdlib.h>
#include <stdio.h>
int* allocSomething() {
return malloc(sizeof(int));
}
int main(int argc, const char * argv[]) {
int* p = allocSomething();
*p = 5;
printf("*p = %d\n", *p);
p = NULL;
return 0;
}
我使用了Clang静态分析器来检测代码,但我也想在Instruments中捕获它,因为我正在寻找一个合适的Valgrind替代品。因此:
- 我将Profile模式更改为使用Debug而不是Release。
- 我确保没有优化。
正如您所看到的,没有泄漏报告。
在网上搜索后,我发现了Can't detect C leaks in xcode 9 instruments,其中作者使用了sleep
,因此我认为Instruments实际上并没有像Valgrind一样覆盖malloc
,而是使用采样技术,并且它不能在这么短的时间内进行采样,因此我将程序更改为:
int main(int argc, const char * argv[]) {
int* p = allocSomething();
p = NULL;
sleep(600000);
return 0;
}
现在我明白了:
![完全没有泄漏](https://istack.dev59.com/kesdJ.webp)
这完全没有意义,因为它是一个明显的内存泄漏。
我认为这可能与优化有关,但是我已经明确地禁用了它。此外,如果我malloc
更多的字节,它会检测到。或者这可能是Instruments的一个bug吗?
所以我想知道这是否是Instruments无法检测到小内存分配的问题?需要注意的是,Valgrind可以很好地处理它,所以我感到惊讶。
你有什么建议吗?