У меня есть приложение 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>