【发布时间】:2020-04-23 23:44:23
【问题描述】:
我正在尝试检测 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 Static Analyzer 运行它,它完成了这项工作,但我希望它也能在 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;
}
这完全没有意义,因为这是明显的内存泄漏。
我会说它必须做一些优化,但我又一次明确地禁用了它。此外,如果我malloc 更多字节,它确实会检测到它。或者可能是 Instruments 中的错误?
所以我想知道这是否是 Instruments 无法检测到小分配的问题?我必须指出,Valgrind 可以很好地处理它,所以我很惊讶。
你有什么建议吗?
【问题讨论】:
标签: c xcode memory-leaks valgrind xcode-instruments