You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用g++ AddressSanitizer检测内存泄漏失败,求排查建议

ASAN调试器下未检测到内存泄漏的排查要点
  • 进程未正常退出:ASAN默认仅在进程正常终止(比如return、exit)时触发内存泄漏检测。如果在调试器中程序停在断点后直接退出调试器(如gdb的quit命令),进程会被强制杀死,ASAN来不及生成泄漏报告。解决方法:让程序运行到自然结束(用continue直到进程退出),或手动触发检查。

  • 手动触发泄漏检查:如果需要在调试中途验证泄漏,可在代码中插入ASAN的泄漏检查API:

    #include <sanitizer/lsan_interface.h>
    
    // 在需要检查的位置调用
    __lsan_do_leak_check();
    

    编译时无需额外参数(-fsanitize=address已包含LSAN),调用后ASAN会立即输出泄漏信息。

  • 验证ASAN_OPTIONS是否生效:在程序中添加代码打印环境变量,确认detect_leaks=1已正确设置:

    #include <cstdlib>
    #include <iostream>
    
    int main() {
        const char* asan_opts = std::getenv("ASAN_OPTIONS");
        if (asan_opts) {
            std::cout << "ASAN_OPTIONS: " << asan_opts << std::endl;
        }
        // 你的测试代码
        std::ignore = malloc(512);
        return 0;
    }
    

    如果输出中没有detect_leaks=1,说明环境变量未正确传递给调试器进程(比如调试器启动时未继承环境变量,需手动在调试器内设置:set environment ASAN_OPTIONS=color=never:detect_leaks=1)。

  • 调试器与ASAN的兼容性:确保编译器(如GCC/Clang)和调试器(如GDB)版本匹配,老旧版本可能存在交互问题,导致泄漏检测失效。建议使用较新版本的工具链。

内容的提问来源于stack exchange,提问作者David Partridge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:34:54