2010-12-13 5 views
1

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

Мой провайдер затем вызывает 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

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