Mac OS:泄漏消毒剂

Mac OS: Leaks Sanitizer

Mac OS X 塞拉 10.13

我按照这里写的做 https://clang.llvm.org/docs/LeakSanitizer.html

即创建了内存泄漏的小应用程序

#include <stdlib.h>
void *p;
int main() {
  p = malloc(7);
  p = 0; // The memory is leaked here.
  return 0;
}

然后构建它并运行测试如何检测到内存泄漏:

admins-Mac:test2 admin$ clang -fsanitize=address -g mleak.c ; ASAN_OPTIONS=detect_leaks=1 ./a.out
==556==AddressSanitizer: detect_leaks is not supported on this platform.
Abort trap: 6
admins-Mac:test2 admin$ 

如何检测泄漏? 我需要将它用于我的大型应用程序。

Apple 发货的 Clang/LLVM 似乎没有 -fsanitize=leak 支持。我通过在 Homebrew 上安装 LLVM 来修复它。 gist

上有更详细的修复
$ brew install llvm@8

# Overwritten default Clang
$ echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> .zshrc

$ source ~/.zshrc
$ which clang
/usr/local/opt/llvm/bin/clang

请注意,您还可以使用 Xcode 附带的 Leaks Instrument 来查找代码中的泄漏,而无需安装任何额外的东西。它的广告不是很好,但它是一个非常有用的工具。从 "Product" 菜单中选择 "Profile"。这可能会重建您的应用程序,然后它将启动 Instruments.app。您将看到 sheet 种不同的分析工具,您可以像这样使用:

一旦您选择它并按下 "record" 按钮,它将 运行 您的应用程序并显示一条显示任何泄漏的轨道,如下所示:

绿色复选标记表示当时应用程序没有泄漏。红色 "x" 表示自上次检查以来出现新泄漏。灰色“-”表示有泄漏,但自上次检查后没有新泄漏。默认为每 10 秒检查一次。

底部是当前泄漏的列表。如果单击其中一个,您将在右侧看到一个堆栈跟踪,显示哪个函数分配了泄漏的内存。

这是一个非常强大的工具,几乎没有文档!我不确定为什么 Apple 会如此隐藏它。

如果您使用 CLion,您可以试试这个设置:

在首选项中 |构建、执行、部署 | CMake -> Cmake 选项 使用

-DCMAKE_BUILD_TYPE=ASAN -DCMAKE_CXX_COMPILER=/usr/local/opt/llvm/bin/clang++