Perflib 2 падает при добавлении счетчика (от Perfmon) - PullRequest
1 голос
/ 13 декабря 2010

У меня есть приложение C ++ (под Win32), для которого мне нужно предоставить информацию о счетчике производительности.Я использую Perflib v2, поэтому создал манифест, который обрабатывается CTRPP.

Мой провайдер без ошибок вызывает PerfAutoInitialize и PerfCreateInstance.

Когда я добавляю счетчик в Perfmon, мое приложение вылетает.Трассировка разборки показывает код в рабочем потоке perflib, вызывающий внутреннюю функцию (pcwum.dll) PerfpAddOrRemoveCounter.Это вызывает PerfpValidateCounter, который возвращает адрес в edi;этот адрес недействителен, и когда вызывающий абонент разыменовывает его, происходит сбой приложения.

Если я перезапускаю своего провайдера, счетчик все еще отображается в Perfmon и правильно увеличивается.

Манифест следует

<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd"
     xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:trace="http://schemas.microsoft.com/win/2004/08/events/trace">
  <instrumentation>
    <counters xmlns="http://schemas.microsoft.com/win/2005/12/counters">
      <provider callback = "custom"
        applicationIdentity = "TPerfStatsCollector.exe"
            providerName = "TPerfstatscollector"
        providerType = "userMode"
        providerGuid = "{33d68436-4cf9-4f58-9976-44b048b072f3}"
        symbol = "symbolGUID">
        <counterSet guid = "{381300a5-3be6-46d8-8615-12d8b259aae4}"
          uri = "A.AxPServer.Counters.Basic"
          name = "Basic counters"
          description = "These are the sample counters"
          instances = "Single"
          symbol = "setGUID">
          <counter id = "1"
            uri = "A.AxPServer.Counters.Basic.Session"
            name = "Sessions"
            description = "Number of sessions"
            type = "perf_counter_rawcount"
            detailLevel = "standard"
            defaultScale = "1">            
          </counter>
        </counterSet>
      </provider>
   </counters>
  </instrumentation>
</instrumentationManifest>

1 Ответ

1 голос
/ 14 декабря 2010

Мой плохой.Это была проблема с 64/32 битами, и я понял, что создаю 32-битный провайдер для работы на 64-битной ОС.Все работает нормально, когда это было выправлено.

...