【问题标题】:LeakSanitizer and leaky librariesLeakSanitizer 和泄漏库
【发布时间】:2020-01-05 01:52:07
【问题描述】:

我正在尝试使用 gcc 的泄漏清理选项来检测我的程序中的泄漏。

为此,我使用相关标志进行编译,运行我的程序,然后终止,这会产生以下输出:

==8013==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 72704 byte(s) in 1 object(s) allocated from:
    #0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
    #1 0x7f3ab2f8690d  (<unknown module>)
    #2 0x7f3ab2f50525  (<unknown module>)

Direct leak of 72704 byte(s) in 1 object(s) allocated from:
    #0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
    #1 0x7f3ab51d2aad  (<unknown module>)
    #2 0x7f3ab51c4475  (<unknown module>)

Direct leak of 256 byte(s) in 1 object(s) allocated from:
    #0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
    #1 0x562db822861c in RenderHandler::RenderHandler() ../Src/main.cpp:68
    #2 0x562db8226ee2 in main ../Src/main.cpp:200
    #3 0x7f3acdf61ee2 in __libc_start_main (/usr/lib/libc.so.6+0x26ee2)

Direct leak of 232 byte(s) in 5 object(s) allocated from:
    #0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
    #1 0x7f3ab3e31677  (<unknown module>)
[...]

据我所知,许多库(甚至标准库)都可能存在代码泄漏,我对此并不十分担心。如果我的视频驱动程序有泄漏代码,我不会修复它。

但是,在上面的堆栈跟踪中,有一个相关的泄漏(报告了第三个)。我特意加的那个。

我不想打印“未知模块”中发生的任何泄漏,因为我无法修复发生在我不知道的地方的泄漏(这些可能来自第三方库),并且它们有倾向于隐藏我实际上可以修复的漏洞。

是否有一种机制来指示泄漏清理器避免打印某些类型的泄漏?

【问题讨论】:

  • 您是否在程序中动态加载某些库?不是动态链接,而是动态加载,例如dlopen().
  • 不直接,我不知道我使用的第三方库是否正在做类似的事情
  • 似乎这是 ASan 的限制,您可以将函数或模块列入黑名单以防止被分析,但前提是您知道符号/模块名称。看起来没有选项可以抑制未知模块的泄漏检测......至少在他们的 wiki 中没有。
  • :C 好吧,这很糟糕,我在官方 github repo 上看到了一种传递抑制文件的方法,你如何在定义的函数上使用它?我正在尝试从报告中删除我自己的泄漏,看看我是否可以破解系统以忽略我不想要的泄漏
  • 看看here,在页尾有说明。

标签: c++ debugging memory-leaks address-sanitizer memory-leak-detector


【解决方案1】:

使用抑制文件,如 AddressSanitizerLeakSanitizer#suppressions 中所述:

您可以通过传入抑制文件来指示 LeakSanitizer 忽略某些泄漏。该文件每行必须包含一个禁止规则,每个规则的格式为leak:&lt;pattern&gt;。该模式将与泄漏的符号化堆栈跟踪进行子字符串匹配。如果函数名、源文件名或二进制文件名匹配,泄漏报告将被禁止。

通过设置环境变量LSAN_OPTIONS=suppressions:my_suppressions.txt,在运行时传递文件。

在您的特定情况下,由于&lt;unknown module&gt; 条目,可能很难找到一个好的字符串来匹配。将-fno-omit-frame-pointer 传递给编译器可能有助于获得更好的堆栈跟踪(无论如何这在调试​​期间很有帮助)。

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2021-11-30
    • 2016-01-17
    • 2021-11-29
    • 2020-02-18
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多