使用windows-sys的Rust性能计数器采集程序内存泄漏排查求助
排查与解决PDH查询导致的内存泄漏问题
核心原因推测
你目前仅保留PdhOpenQueryW调用仍出现内存泄漏,最可能的原因是未调用PdhCloseQuery释放查询句柄。Windows PDH API属于原生系统API,创建的查询句柄不会被Rust的自动内存管理机制回收,必须手动调用对应关闭函数释放资源。每次调用PdhOpenQueryW成功创建句柄后,若不关闭,会导致句柄及关联的系统内存持续泄漏,表现为私有字节线性增长。
具体解决步骤
- 强制配对调用句柄创建与关闭函数:
确保每次成功调用PdhOpenQueryW后,在句柄不再使用时(比如循环迭代结束、作用域退出前)调用PdhCloseQuery释放资源。示例代码结构如下:use windows_sys::Win32::System::PerformanceData::{PdhCloseQuery, PdhOpenQueryW, PDH_ERROR_SUCCESS}; use std::ptr; fn main() { loop { let mut query_handle = 0; let status = unsafe { PdhOpenQueryW(ptr::null_mut(), 0, &mut query_handle) }; if status == PDH_ERROR_SUCCESS { // 原注释的PDH相关操作代码 // 必须释放查询句柄 let close_status = unsafe { PdhCloseQuery(query_handle) }; // 可选:检查关闭是否成功,排查异常情况 if close_status != PDH_ERROR_SUCCESS { // 处理关闭失败的日志或逻辑 } } // 其他业务逻辑 } } - 验证句柄操作的正确性:
确认PdhOpenQueryW的参数传递无误:第一个参数传ptr::null_mut()(无预设数据源),第二个参数传0或ptr::null_mut()(无事件句柄),第三个参数是有效的句柄指针。若调用失败,无需执行关闭操作,但要确保成功创建的句柄100%被释放。 - 排查隐性原生资源泄漏:
若添加PdhCloseQuery后仍有泄漏,检查是否存在宽字符串转换等隐性内存分配未释放的情况(比如手动调用MultiByteToWideChar分配的内存未用LocalFree释放),但结合你的排查情况,这一步优先级低于句柄释放检查。
内容的提问来源于stack exchange,提问作者Tushar Saurabh
相关产品推荐
相关产品推荐

