首页 > 解决方案 > 检测泄漏与泄漏检查at_exit?

问题描述

我使用AddressSanitizer来检查我的应用程序的内存泄漏,但我对这两个标志之间的区别感到困惑:detect_leaksvs leak_check_at_exit.

我认为下面的代码应该报告内存泄漏,即使leak_check_at_exit=0因为泄漏已经发生在每个循环期间,而不是在主函数返回之后:

int main() {
    void *mem;
    for(int i=0; i<1000; i++) {
        mem = malloc(1024);
    }
    return 0;
}

随着detect_leaks=1:leak_check_at_exit=1程序确实给出了正确的内存泄漏报告:

=================================================================
==73448==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 1024000 byte(s) in 1000 object(s) allocated from:
    #0 0x7f0933f053f8 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.3+0xc23f8)
    #1 0x42c8c1 in main src/main.cpp:10
    #2 0x7f0931b05ec4 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)

detect_leaks=1:leak_check_at_exit=0它不会报告任何内存泄漏。在我看来,设置leak_check_at_exit=0等同于设置detect_leaks=0

问题detect_leaks:和有什么区别leak_check_at_exit

标签: memory-leaksaddress-sanitizer

解决方案


LeakSanitizer 的工作原理是分析程序内存中指向已分配块的指针。分析非常慢,因此仅在执行结束时执行(您也可以通过调用来运行它__lsan_do_leak_check)。

当你设置leak_check_at_exit=0你有效地禁用 Lsan。您可以在每次循环迭代时手动插入__lsan_do_leak_check,但这会减慢程序速度,并且如果您的应用程序有多个线程,也可能无法正常运行。


推荐阅读