gpt4 book ai didi

c++ - 从非托管代码更新性能计数器

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:43 24 4
gpt4 key购买 nike

我在使用 PerflibV2 预览自定义性能计数器时遇到问题。

性能监视器按 GUID 显示我的自定义性能计数器组,当我想扩展它时,会显示“无法加载计数器”。

我尝试将自己添加到“Performance Monitor Users”和“Performance Log Users”组,但没有成功。

我用谷歌搜索,并阅读了很多 MSDN 文章,但没有成功。

有人熟悉这个问题吗?

以下是我如何创建和添加自定义性能计数器的详细过程:

我需要创建一个性能计数器,它将从我未受管理的应用程序中更新。

我发现了两种方法:

  • 包装托管性能计数器 API,这不是一个选项,因为它会影响性能;

  • 使用提供所需功能的 PerflibV2;

作为测试应用程序,我创建了以下描述自定义性能计数器的 schema.xml 架构:

<!-- <?xml version="1.0" encoding="UTF-16"?> -->
<instrumentationManifest
xmlns="http://schemas.microsoft.com/win/2004/08/events"
xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<instrumentation>
<counters xmlns="http://schemas.microsoft.com/win/2005/12/counters">
<provider callback = "custom"
applicationIdentity = "PerfCounters.exe"
providerType = "userMode"
providerGuid = "{ab8e1320-965a-4cf9-9c07-fe25378c2a23}">
<counterSet
guid = "{ad36a036-c923-4794-b696-70577630b5cf}"
uri = "Microsoft.Windows.System.PerfCounters.MyCounterSet1"
name = "My LogicalDisk"
description = "This is a sample counter set with multiple instances."
instances = "multiple">
<counter id = "1"
uri = "Microsoft.Windows.System.PerfCounters.MyCounterSet1.MyCounter1"
name = "My Free Megabytes"
description = "First sample counter."
type = "perf_counter_rawcount"
detailLevel = "standard"
defaultScale = "1"/>
</counterSet>
</provider>
</counters>
</instrumentation>
</instrumentationManifest>

并执行:

ctrpp schema.xml

我将创建的文件添加到我的测试应用程序中,并且在我的测试应用程序中,大致:

PerfAutoInitialize();

ULONG instanceId = 0;
wchar_t instanceName[] = {'t', 'e', 's', 't', 0};
PPERF_COUNTERSET_INSTANCE b = PerfCreateInstance(hDataSource_schema_1, &CtrSetGuid_schema_1_1, instanceName, instanceId);

我安装了性能计数器:

lodctr /m:schema.xml

我的 PerfCounters 应用程序在尝试从性能监视器读取计数器时已启动并正在运行。

最佳答案

注册 PerfCounter 提供程序失败的原因有以下几个:

  • 检查 list 文件的架构是否有效。您可以根据 XSD definition file provided by Microsoft 验证文件.

  • 如果您想检查,请使用 lodctr 注册您的 list 工具。确保你运行 lodctr工具作为管理员。如果你的权限不足,它会默默地失败。注册 list 后,您应该能够在 PerfCounter 对话框中看到 CounterSet 的 GUID。 (有关可以列出提供商的工具,请参阅 Browsing Performance Counters。)

GUID Displayed in the PerfCounter browser dialog

  • 您必须同时生成头文件和资源文件(使用 -rc-octrpp 选项)。必须将资源文件添加到您的解决方案中。

  • 构建您的应用程序,然后重新运行 lodctr工具,同时当前目录中有 list 文件和您的 .exe。确保 list 文件指向 applicationIdentity 中二进制文件的文件名提供者的属性(property):

    <provider symbol="MyProvider" applicationIdentity="PerfCounterTest.exe" providerName="PerfCounterTest"

  • 运行应用。当应用程序运行时,您应该能够在浏览器对话框中看到您的提供商的名称:

enter image description here

关于c++ - 从非托管代码更新性能计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10997434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com