OpenVINO开发小组
直播中

李静

8年用户 1074经验值
私信 关注
[问答]

在OpenVINO™ C++代码中启用 AddressSanitizer 时的内存泄漏怎么解决?

在 OpenVINO™ C++代码中启用 AddressSanitizer 时遇到内存泄漏:
"#0 0xaaaab8558370 in operator new(unsigned long);
#10 0xffffbd13f788 in ov::Core::compile_model(std::shared_ptr const&,
std::__cxx11::basic_string, std::allocator> const&, std::map,
std::allocator>, ov::Any, std::less, std::allocator>>,
std::allocator, std::allocator> const, ov::Any>>> const&) "

回帖(2)

吴少杰

2025-6-23 14:55:51
内存泄漏问题是 OpenVINO™ 2023.2 的已知问题。
此问题已在 2024.5 OpenVINO™修复。
升级到 OpenVINO 2024.5 或更高版本。
举报

晴兮晴兮

2025-6-24 17:58:53

在 OpenVINO™ C++ 代码中启用 AddressSanitizer (ASan) 时遇到内存泄漏问题(特别是涉及 ov::Core::compile_model 的泄漏),可以按照以下步骤解决:




1. 确认泄漏的真实性



  • 系统库的误报:ASan 有时会报告来自系统库(如 OpenVINO 的内部实现)的误报。确保泄漏不是来自系统库的正常行为(例如缓存、延迟释放)。

    • 在泄漏报告中,如果调用栈顶部完全是 OpenVINO 内部函数(如 ov::Core::compile_model)且不涉及用户代码,可能是库的内部行为。


  • 升级 OpenVINO:使用最新版本的 OpenVINO,修复的版本可能已解决泄漏(参考 OpenVINO Release Notes)。




2. 检查用户代码的资源释放



  • ov::CompiledModel 对象生命周期:确保返回的 ov::CompiledModel 对象及时析构:
     {
         ov::CompiledModel compiled_model = core.compile_model(model, device);
         // 使用 compiled_model
    } // 离开作用域时自动析构,释放资源

  • 避免静态对象:不要将 ov::Coreov::CompiledModel 存储在全局/静态变量中(可能无法正常析构)。
     // 错误示例:静态对象可能无法被 ASan 正确跟踪
    static ov::Core core;




3. 清理 OpenVINO 全局资源



  • 显式释放 OpenVINO 核心对象:在程序退出前调用 ov::shutdown()
     int main() {
         ov::Core core;
         // ... 其他代码 ...
         ov::shutdown(); // 显式清理全局资源
         return 0;
    }

  • 使用 OV_CORE_CLEANUP:某些版本需要定义环境变量:
     export OV_CORE_CLEANUP=1  # Linux/macOS
    set OV_CORE_CLEANUP=1     # Windows




4. 配置 ASan 忽略规则



  • 抑制误报:通过 ASan 的 suppressions 文件忽略 OpenVINO 内部泄漏:

    • 创建文件 asan_suppress.txt
      leak:ov::Core::compile_model
      leak:operator new

    • 设置环境变量:
      export ASAN_OPTIONS="suppressions=asan_suppress.txt"


  • 直接禁用泄漏检测(临时调试用):
     export ASAN_OPTIONS="detect_leaks=0"




5. 检查多线程问题



  • 线程安全:如果并发调用 ov::Core::compile_model,确保 ov::Core 对象是线程安全的(通过锁或局部实例):
     std::mutex core_mutex;
    void thread_func() {
         std::lock_guard lock(core_mutex);
         ov::CompiledModel model = core.compile_model(...);
    }




6. 完整的最小复现代码



  • 验证问题是否存在
     #include 
    int main() {
         ov::Core core;
         auto model = core.read_model("model.xml");
         {
             auto compiled_model = core.compile_model(model, "CPU");
         } // compiled_model 析构
         ov::shutdown(); // 显式清理
         return 0;
    }

  • 如果仍有泄漏,可能是 OpenVINO 的内部问题。




7. 其他高级选项



  • 重编译 OpenVINO 启用 ASan(仅限开发者):
     mkdir build && cd build
    cmake -DENABLE_SANITIZER=address ..
    make

  • 使用 Valgrind 交叉验证
     valgrind --leak-check=full ./your_program




总结步骤:



  1. 升级到最新 OpenVINO 版本。

  2. 确保用户代码中及时释放 ov::Coreov::CompiledModel

  3. 调用 ov::shutdown() 并设置 OV_CORE_CLEANUP

  4. 通过 ASan 抑制文件忽略泄漏。

  5. 检查多线程同步问题。


如果问题仍未解决,在 OpenVINO GitHub Issues 提交详细报告(附 ASan 输出和复现代码)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分