c# .net debugging performancecounter

c# - ¿Qué haría que PerformanceCounterCategory.Exists cuelgue indefinidamente?



.net debugging (1)

Tengo una aplicación que usa contadores de rendimiento, que funcionó durante meses. Ahora, en mi máquina de desarrollo y otra máquina de desarrollo, comenzó a colgarse cuando llamé a PerformanceCounterCategory.Exists. Por lo que puedo ver, se cuelga indefinidamente. No importa qué categoría utilizo como entrada, y otras aplicaciones que usan la API exhiben el mismo comportamiento.

La depuración (utilizando servidores de símbolos MS) ha demostrado que se trata de una llamada a Microsoft.Win32.RegistryKey que se cuelga. La investigación adicional muestra que es esta línea la que cuelga:

while (Win32Native.ERROR_MORE_DATA == (r = Win32Native.RegQueryValueEx(hkey, name, null, ref type, blob, ref sizeInput))) {

Esto es básicamente un bucle que intenta asignar suficiente memoria para los datos del contador de rendimiento. Comienza en size = 65000 y hace algunas iteraciones. En la 4ª llamada, cuando size = 520000 , se cuelga Win32Native.RegQueryValueEx .

Además, de manera bastante preocupante, encontré este comentario en la fuente de referencia de PerformanceCounterLib.GetData:

// Win32 RegQueryValueEx for perf data could deadlock (for a Mutex) up to 2mins in some // scenarios before they detect it and exit gracefully. In the mean time, ERROR_BUSY, // ERROR_NOT_READY etc can be seen by other concurrent calls (which is the reason for the // wait loop and switch case below). We want to wait most certainly more than a 2min window. // The curent wait time of up to 10mins takes care of the known stress deadlock issues. In most // cases we wouldn''t wait for more than 2mins anyways but in worst cases how much ever time // we wait may not be sufficient if the Win32 code keeps running into this deadlock again // and again. A condition very rare but possible in theory. We would get back to the user // in this case with InvalidOperationException after the wait time expires.

¿Alguien ha visto este comportamiento antes? ¿Qué puedo hacer para resolver esto?


Este problema ya está solucionado, y como no ha habido respuestas aquí, agregaré una respuesta aquí en caso de que la pregunta se encuentre en búsquedas futuras.

Finalmente solucioné este error deteniendo el servicio de cola de impresión (como medida temporal).

Parece que la lectura de los contadores de rendimiento realmente necesita enumerar las impresoras en el sistema (confirmado por un volcado de WinDbg de un proceso pendiente, donde puedo ver en el seguimiento de la pila que winspool está enumerando impresoras y está atrapado en una llamada de red) . Esto era lo que realmente estaba fallando en el sistema (y efectivamente, la ventana de "Dispositivos e impresoras" también se colgó). Me desconcierta que un problema de impresora / red pueda hacer que los contadores de rendimiento bajen. Uno podría pensar que existió algún tipo de falla incorporada para tal caso.

Lo que supongo es que esto se debe a una mala impresora / controlador en la red. Todavía no he vuelto a habilitar la impresión en los sistemas afectados, ya que estamos buscando la mala impresora.