Tus*_*abh 3 windows performancecounter rust
我使用 windows-sys crate 编写了一个 Rust 程序,并收集所提供的查询的性能计数器值。我使用微软团队提供的示例程序(此处)。
该程序能够检索性能计数器值。然而,当我检查进程资源管理器以监视占用空间时,我注意到下面的私有字节图表。由于私有字节呈线性增加,因此表明存在内存泄漏。
我无法使用 Windbg,因为 Windbg 无法连接到 Microsoft 符号服务器。因此,我决定通过注释代码并检查私有字节来手动识别问题的根源。相关代码如下——
fn execute_perf_query(input_query: &String,perf_query: &mut Vec<PerfEntryForMongo>)->f64{
log::info!("Performing counter for {:?}", input_query);
let hostname = gethostname().into_string();
unsafe {
let mut query = 0;
let p: *const u16 = std::ptr::null();
PdhOpenQueryW(p, 0 as usize, &mut query);
}
return -1.0;
//println!("Returning Now");
}
Run Code Online (Sandbox Code Playgroud)
请注意,目前我已注释掉与PdhAddCounterW、 、相关的代码PdhCollectQueryData,PdhGetFormattedCounterValue以了解每个 Windows 调用对私有字节的影响。
Vec<PerfEntryForMongo>每次迭代后都会被清除,因此不会导致内存泄漏。hostname是一个字符串,将在堆上分配,但是一旦范围结束,内存将被释放。
我正在使用原始指针,但它是一个 NULL 指针,不应在堆中分配任何内存。我需要了解什么导致内存泄漏。我已经介绍了与引用、借用和不安全 Rust 相关的章节,但我无法确定内存泄漏的原因。
pro*_*-fh 10
该PdhOpenQueryW()调用将创建资源并更新query句柄。您需要使用 释放与此句柄关联的资源PdhCloseQuery()。
因为所有这些都发生在一个unsafe块中,Rust 信任您,并且无法自行决定是否应该释放该资源。
每次调用该函数时,创建的资源都会泄漏。
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |