2

PerflibV2 でのカスタム パフォーマンス カウンターのプレビューに問題があります。

パフォーマンス モニターはカスタム パフォーマンス カウンター グループを GUID で表示し、展開しようとすると「カウンターを読み込めません」と表示されます。

「Performance Monitor Users」および「Performance Log Users」グループに自分自身を追加しようとしましたが、成功しませんでした。

私はそれをグーグルで検索し、MSDN の記事をたくさん読みましたが、成功しませんでした。

誰かがこの問題に精通していますか?

以下は、カスタム パフォーマンス カウンターを作成して追加する方法の詳細な手順です。

管理されていないアプリケーションから更新されるパフォーマンス カウンターを作成する必要があります。

私が見つけた2つのアプローチがあります:

  • マネージド パフォーマンス カウンター 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 アプリケーションが稼働しています。

4

3 に答える 3

1

この質問には既に回答があることは知っていますが、同じ問題に遭遇しました。これは、生成された .RC ファイルを実行可能ファイルに含めるのを忘れたことが原因でした。.RCファイルを含む実行可能ファイルをstringtableで再コンパイルし、スキーマファイルを編集して編集すると、動作し始めましたunlodctrlodctr

于 2013-07-26T17:53:23.330 に答える
1

私のサンプルの正確な問題は何でしたか完全にはわかりませんが、Windows 7 および .NET Framework 3.5 SP1 用の Microsoft Windows SDK を使用した Microsoft の例があります。

http://www.microsoft.com/en-us/download/confirmation.aspx?id=3138

インストール後の MS SDK サンプルは次の場所にあります。

C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\winbase\PerfCounters\Basic\CPP

Windows 7 に適合させる必要があります (ctrcpp の引数は少なく、CounterInitialize() と CounterCleanup() の代わりに PerfAutoInitialize() と PerfAutoCleanup() が使用されます)。

Perfmon からカウンターを追加するとアプリがクラッシュします。次を参照してください: (Perfmon から) カウンターを追加すると Perflib 2 がクラッシュする

于 2012-06-14T10:46:09.000 に答える