【问题标题】:What should I fix when Address Sanitizer says detect_leaks is not supported on this platform?当 Address Sanitizer 说此平台不支持 detect_leaks 时,我应该如何解决?
【发布时间】:2020-09-30 13:36:08
【问题描述】:

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

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

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

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

编译成功。但是,当我尝试使用运行时标志 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)我的程序以无限循环运行。如果我是对的,Valgrind 在退出程序后会显示消息,所以它不会工作。

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

【问题讨论】:

    标签: gcc memory-leaks clang address-sanitizer


    【解决方案1】:

    我做错了什么?

    什么都没有。问题是您的 Clang 版本不支持泄漏检测。但是,它看起来像最新版本一样。请参阅this answerthis recipe

    Valgrind 退出程序后显示消息,所以它不会工作。

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

    有两种解决方法:

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

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

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

    【讨论】:

    • 感谢您的回答!很难相信在 MacOS 上找到一个好的泄漏检测解决方案对我来说并不容易。我想知道人们如何处理内存泄漏问题。
    猜你喜欢
    • 2018-04-04
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多