2010-12-13 20 views
1

J'ai une application C++ (sous Win32) pour laquelle j'ai besoin de fournir des informations sur le compteur de performance. J'utilise Perflib v2, donc j'ai créé un manifeste qui est traité par CTRPP.Perflib 2 se bloque lors de l'ajout d'un compteur (à partir de Perfmon)

Mon fournisseur appelle ensuite PerfAutoInitialize et PerfCreateInstance sans erreur.

Lorsque je vais ajouter le compteur dans Perfmon, mon application se bloque. Le suivi du désassemblage montre le code dans le thread de travail perflib appelant la fonction interne (pcwum.dll) PerfpAddOrRemoveCounter. Cela fait appel à PerfpValidateCounter qui retourne une adresse dans edi; cette adresse est invalide et lorsque l'appelant la déréférence, l'application se bloque.

Si je redémarre mon fournisseur, le compteur est toujours visible dans Perfmon et incrémente correctement.

Manifest suit

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

Répondre

1

Mon mauvais. C'était un problème 64/32 bits et je me suis rendu compte que je construisais un fournisseur 32 bits pour fonctionner sur un système d'exploitation 64 bits. Tout fonctionne bien quand cela a été réglé.