当 Address Sanitizer 显示此平台不支持 detect_leaks 时,我应该如何解决?

What should I fix when Address Sanitizer says detect_leaks is not supported on this platform?

我在 x86_64 OS X(MacOS 10.15.5 Catalina) 上使用 Clang 编译我的项目。

我想准确地确定是从哪个文件、哪个函数、哪一行导致内存泄漏的。我正在尝试使用 Address Sanitizer, specifically Leak Sanitizer.

以下是我在编译时使用的标志:

-Wall -Wextra -flto -O3 -march=native -ffast-math -fsanitize=address

编译成功。但是,当我尝试使用 运行-time 标志 ASAN_OPTIONS=detect_leaks=1 以启用 Leak Sanitizer 时,我看到以下错误:

==26454==AddressSanitizer: detect_leaks is not supported on this platform.
Abort trap: 6

我做错了什么?我该如何解决这个问题?

或者,是否有其他替代 Valgrind 的好方法? Valgrind 对我不起作用,因为 1) 我正在使用 MacOS Catalina,2) 我的程序 运行s 有一个无限循环。如果我是对的,Valgrind 会在退出程序后显示消息,所以它不会工作。

如果有人能就此问题给我建议,我将不胜感激。

What am I doing wrong?

没有。问题是您的 Clang 版本不支持泄漏检测。但是,它看起来像最新版本。参见 and this recipe

Valgrind displays messages after exiting the program, so it won't work.

您说得有点对:默认情况下,Valgrind 只会在程序退出时执行泄漏分析。

有两种解决方法:

  1. 让你的程序在执行过程中的某个明确定义的地方退出,例如经过N次计算,或绘制K帧等

  2. 让你的程序执行 VALGRIND_DO_LEAK_CHECK client request.

  3. 如果你只想在某些条件成立时执行泄漏检查,并且很难从程序中检测这些条件是否为真,你可以使用 GDB 和 monitor command要求 Valgrind 在需要时执行泄漏检查。