2010-12-13 13 views
1

Ich habe eine C++ - Anwendung (unter Win32), für die ich Leistungsindikatorinformationen bereitstellen muss. Ich benutze Perflib v2, also habe ich ein Manifest erstellt, das von CTRPP verarbeitet wird.Perflib 2 stürzt beim Hinzufügen eines Leistungsindikators ab (von Perfmon)

Mein Provider ruft dann PerfAutoInitialize und PerfCreateInstance ohne Fehler auf.

Wenn ich den Leistungsindikator in Perfmon hinzufügen, stürzt meine Anwendung ab. Beim Durchlaufen der Disassemblierung wird der Code im Perflib-Worker-Thread angezeigt, der die interne Funktion (pcwum.dll) PerfpAddOrRemoveCounter aufruft. Dies ruft PerffValidateCounter auf, das eine Adresse in edi zurückgibt; Diese Adresse ist ungültig und wenn der Aufrufer es dereferenziert, stürzt die Anwendung ab.

Wenn ich meinen Anbieter neu starte, ist der Leistungsindikator immer noch in Perfmon sichtbar und wird korrekt inkrementiert.

Manifest folgt

<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> 

Antwort

1

Mein schlecht. Dies war ein 64/32-Bit-Problem und ich erkannte, dass ich einen 32-Bit-Anbieter für ein 64-Bit-Betriebssystem entwickelte. Alles funktioniert gut, wenn dies geklärt wurde.

Verwandte Themen