5 gcc memory-leaks clang address-sanitizer
我正在使用 Clang 在 x86_64 OS X(MacOS 10.15.5 Catalina) 上编译我的项目。
我想准确地识别哪个文件、哪个函数、哪一行导致了内存泄漏。我正在尝试使用Address Sanitizer,特别是Leak Sanitizer。
以下是我在编译时使用的标志:
-Wall -Wextra -flto -O3 -march=native -ffast-math -fsanitize=address
Run Code Online (Sandbox Code Playgroud)
它成功编译。但是,当我尝试使用运行时标志ASAN_OPTIONS=detect_leaks=1来启用 Leak Sanitizer 时,我看到以下错误:
==26454==AddressSanitizer: detect_leaks is not supported on this platform.
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我该如何解决这个问题?
或者,除了 Valgrind 还有其他好的替代品吗?Valgrind 不适合我,因为 1)我使用的是 MacOS Catalina,2)我的程序以无限循环运行。如果我是对的,Valgrind 会在退出程序后显示消息,所以它不会工作。
如果有人能给我关于这个问题的建议,我将不胜感激。
我究竟做错了什么?
没有什么。问题是您的 Clang 版本不支持泄漏检测。不过,最新版本看起来确实如此。请参阅这个答案和这个食谱。
Valgrind 退出程序后会显示消息,因此它不起作用。
你是对的:默认情况下,Valgrind 仅在程序退出时执行泄漏分析。
有两种方法可以解决这个问题:
让你的程序在执行过程中某个明确定义的地方退出,例如在执行N次计算或绘制K帧等之后。
让您的程序执行 VALGRIND_DO_LEAK_CHECK客户端请求。
如果您只想在满足某些条件时才执行泄漏检查,并且很难从程序内部检测这些条件是否成立,则可以使用 GDB 和监视命令要求Valgrind 在需要时执行泄漏检查。
| 归档时间: |
|
| 查看次数: |
2826 次 |
| 最近记录: |