【问题标题】:How to find reason of memory leak with Leak Sanitizer如何使用 Leak Sanitizer 查找内存泄漏的原因
【发布时间】:2017-10-05 00:07:53
【问题描述】:

我有一个使用 tbb 的 C++ 程序,我正在使用 GCC 6.2.1 在 64 位 Linux 上进行编译。 当我使用 address sanitizer(-fsanitize=address) 编译并运行单元测试时,会生成以下输出:

...
[  PASSED  ] 56 tests.

=================================================================
==12326==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 54 byte(s) in 3 object(s) allocated from:
    #0 0x7f4c634fd020 in strdup (/usr/lib64/libasan.so.3+0x58020)
    #1 0x301d215bb4  (/usr/lib64/libtbb.so.2+0x301d215bb4)

SUMMARY: AddressSanitizer: 54 byte(s) leaked in 3 allocation(s).
make[3]: *** [CMakeFiles/check] Error 1
make[2]: *** [CMakeFiles/check.dir/all] Error 2
make[1]: *** [CMakeFiles/check.dir/rule] Error 2
make: *** [check] Error 2

代码是在关闭优化 (-O0) 和 -fno-omit-frame-pointer 的情况下编译的。我怎样才能获得有关泄漏的更多信息?

【问题讨论】:

  • 你试过 valgrid 了吗?
  • 好点@gsamaras 我会尝试看看 valgrind 是否返回更多信息。

标签: c++ memory-leaks address-sanitizer


【解决方案1】:

泄漏发生在系统库中,该系统库可能是在没有-fno-omit-frame-pointer 的情况下编译的,因此 Asan 无法使用帧指针展开它。您可以通过设置尝试使用缓慢但更强大的 DWARF 展开器

# Or LSAN_OPTIONS, if you use standalone LSan
export ASAN_OPTIONS=fast_unwind_on_malloc=0

有关运行时标志的更多详细信息,请参阅 herehere

顺便说一句,您可以通过

要求 LSan 不要因错误而中止
# Or LSAN_OPTIONS, if you use standalone LSan
export ASAN_OPTIONS=exitcode=0:...

【讨论】:

  • 我已经尝试禁用fast_unwind_on_malloc并获得了更多信息,但仍然不足以查明问题,似乎这也与pthread有关。我将不得不对此进行更多研究,但感谢您给我指导并回答我的问题!
猜你喜欢
  • 2012-09-15
  • 2017-07-31
  • 2011-01-14
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多