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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:57:17