Category Archives: Depuración

El worker role de Azure lanza un FileNotFoundException al cargar

Actualmente estoy trabajando en un player con tecnología de smooth streaming basado en Silverlight y tenemos algunos servicios que el player consume que queremos publicar en Azure. El caso es que me he puesto a hacer las primeras pruebas en Azure en mi maquina local, pero cada vez que ejecuto el projecto el Azure Simulation Environment este me lanza un FileLoadException.

[runtime] Role entrypoint could not be created:
System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Silverlight.MediaPlayer.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a10dc7bdece43c5c' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
File name: 'Microsoft.Silverlight.MediaPlayer.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a10dc7bdece43c5c' ---> System.IO.FileLoadException: Could not load file or assembly 'file:///C:\Plain\Microsoft.SmoothPlayer\Source\Azure\Microsoft.Silverlight.MediaPlayer.Online\bin\Debug\Microsoft.Silverlight.MediaPlayer.Online.csx\roles\Microsoft.Silverlight.MediaPlayer.Web\approot\bin\Microsoft.Silverlight.MediaPlayer.Web.dll' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
File name: 'file:///C:\Plain\Microsoft.SmoothPlayer\Source\Azure\Microsoft.Silverlight.MediaPlayer.Online\bin\Debug\Microsoft.Silverlight.MediaPlayer.Online.csx\roles\Microsoft.Silverlight.MediaPlayer.Web\approot\bin\Microsoft.Silverlight.MediaPlayer.Web.dll'

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)
   at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(RoleType roleTypeEnum)
   at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)

Llegado a este punto hice una doble comprobación de que realmente el fichero estaba ahi y se tenian permisos para leer el fichero. Active la salida del Fusion Log para ver los errores de carga de los ensamblados pero no me aparecía nada. Así que decidí utilizar el WinDBG para sacar un poco más de información.

Me atache al proceso host de web de Azure WaWebHost.exe (Microsoft Windows Azure Web Host), cargue todos los símbolos y SOS. El primer comando que ejecute fue !threads y encontré esto:

0:000> !threads
ThreadCount: 6
UnstartedThread: 0
BackgroundThread: 5
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                              PreEmptive                                                Lock
       ID OSID        ThreadOBJ     State   GC     GC Alloc Context                  Domain           Count APT Exception
XXXX    1 1ba0 000000000014c4a0   2008220 Enabled  00000000053a1c10:00000000053a1fd0 0000000002f182a0     1 Ukn System.IO.PathTooLongException (0000000005305a80)
XXXX    2  294 00000000000e46d0      b220 Enabled  00000000053d09f8:00000000053d1fd0 0000000002f17990     0 MTA (Finalizer)
XXXX    3 13b0 00000000022f9350   a802220 Enabled  0000000000000000:0000000000000000 0000000002f17990     0 MTA (Threadpool Completion Port)
XXXX    4 1a80 0000000002fbc080    80a220 Enabled  0000000000000000:0000000000000000 0000000002f17990     0 MTA (Threadpool Completion Port)
XXXX    5 1ae0 0000000002fbe650      1220 Enabled  0000000000000000:0000000000000000 0000000002f17990     0 Ukn
   0    6  7e4 0000000002fe22c0      1020 Enabled  00000000053c69b0:00000000053c7fd0 0000000002f182a0     0 Ukn System.IO.FileLoadException (00000000053a7ca8)

Como se puede observer hay dos dominios de aplicación cargados en el proceso, el thread 1 y 6 están ejecutando código de ese dominio de aplicación y el thread 1 muestra la excepción que estamos depurando FileLoadException pero el thread 6 muestra un System.IO.PathTooLongException.

0:001> !pe 0000000005305a80
Exception object: 0000000005305a80
Exception type: System.IO.PathTooLongException
Message: The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
InnerException: <none>
StackTrace (generated):
    SP               IP               Function
    00000000031BD360 000007FEED2D5A8F mscorlib_ni!System.IO.Path.NormalizePathFast(System.String, Boolean)+0xd0f
    00000000031BD420 000007FEED239CA6 mscorlib_ni!System.IO.File.Exists(System.String)+0x96

StackTraceString: <none>
HResult: 800700ce
The current thread is unmanaged

Así que el único problema es que el path del fichero es demasiado largo y el sistema no puede cargarlo.

Espero que os sea de ayuda!

Luis Guerrero.

Detectando problemas de memoria con Silverlight

Hola a todos!

Hoy vamos a hablar sobre un memory leak encontrado en Silverlight 4 y reportado en el foro de silverilght.net por el usuario tsheflin. Como sabrás Silverlight está basado en tecnología .net lo que significa que puedes escribir tus aplicaciones en C# o en Visual Basic y tienes todas las cosas buenas de .net como gestión automática de memoria, recolección de elementos no utilizados y seguridad de tipos

Pero algunas veces algo sale más y aun teniendo la gestión automática de memoria de .net nos podemos encontrar con problemas, es por eso que hoy vamos a ver cómo podemos identificar estos problemas con WinDBG y sos para Silverlight.

Voy a usar como ejemplo el codigo subido por el usuario del foro de Silverlight.net. Puedes descargarlo desde aquí.

Lo primero de todo necesitamos ejecutar nuestra aplicación en modo release. Esto es importante porque hay pequeñas diferencias entre el modo debug y el release. Una vez que tenemos la aplicación ejecutándose es tiempo de WinDGB.

Si tu navegador es Windows Internet Explorer 8 y estás ejecutándolo sobre Windows 7 o Vista, sabrás que IE ejecuta cada tab en un proceso separado y por eso primero tienes que identificar cual es el proceso de IE que está ejecutando el código, en mi caso es el proceso 7958.

Con WinDBG abierto (puedes descargarlo de aquí) tienes que ir a File -> Attach to process (F6), y selecciona la id de tu proceso (en mi maquina es 7958), inmediatamente aparecerá en la ventana de salida toda la información básica de depuración. Teniendo en cuenta que nuestra aplicación es una aplicación administrada y WinDBG está diseñado para depurar aplicaciones nativas necesitamos una extensión del depurador para trabajar con aplicaciones administradas. Lo que necesitamos es SOS (Son of Strike) que está localizado en C:\Program Files (x86)\Microsoft Silverlight\4.0.50401.0\sos.dll. Para cada version de silverligh hay una versión de SOS, así que depende de la versión de Silveright que estés depurando tendrás que usar una u otra.

Para cargar SOS escribimos

.load C:\Program Files (x86)\Microsoft Silverlight\4.0.50401.0\sos.dll

Lo siguiente que necesitamos encontrar es una direccion valida del tipo que estamos buscando SilverlightVisualTreeRemovalFail.SilverlightControl1 y para eso tenemos que usar el comando !dumpheap para volcar todos los tipos filtrados por este tipo.

!dumpheap -type SilverlightVisualTreeRemovalFail.SilverlightControl1

0:005> !dumpheap -type SilverlightVisualTreeRemovalFail.SilverlightControl1

Address MT Size

087aad6c 04a45230 92

087ab460 04a45230 92

087ab6f0 04a45230 92

087ac01c 04a45230 92

087ac710 04a45230 92

087ace04 04a45230 92

087ad4f8 04a45230 92

087adbec 04a45230 92

087ae2e0 04a45230 92

087ae9d4 04a45230 92

087af0c8 04a45230 92

087af7bc 04a45230 92

087afeb0 04a45230 92

087b05a4 04a45230 92

087b0c98 04a45230 92

087b138c 04a45230 92

087b1a80 04a45230 92

087b2174 04a45230 92

087b2868 04a45230 92

087b2f5c 04a45230 92

087b3650 04a45230 92

087b3d44 04a45230 92

087b4438 04a45230 92

087b4b2c 04a45230 92

087b5220 04a45230 92

087b5914 04a45230 92

087b6008 04a45230 92

087b66fc 04a45230 92

087b6df0 04a45230 92

087b74e4 04a45230 92

087b7bd8 04a45230 92

087b82cc 04a45230 92

087b89c0 04a45230 92

087b90b4 04a45230 92

087b97a8 04a45230 92

087b9e9c 04a45230 92

087ba590 04a45230 92

087bac84 04a45230 92

087bb378 04a45230 92

087bba6c 04a45230 92

087bc160 04a45230 92

087bc854 04a45230 92

087bcf48 04a45230 92

087bd63c 04a45230 92

087bdd30 04a45230 92

087be424 04a45230 92

087beb18 04a45230 92

087bf20c 04a45230 92

087bf900 04a45230 92

087bfff4 04a45230 92

En la ventana de salida encontramos direcciones del tipo que hemos solicitado, seleccionamos una 087b1a80 y buscamos que objetos están referenciando este objeto (esto es lo que está causando que el objeto no sea recolectado) escribiendo esto:

!gcroot 087b1a80

0:005> !gcroot 087b1a80

Note: Roots found on stacks may be false positives. Run "!help gcroot" for

more info.

Scan Thread 5 OSTHread 10e8

Scan Thread 22 OSTHread 1f8

Scan Thread 23 OSTHread 1588

DOMAIN(07134BE0):HANDLE(Pinned):4a912f8:Root: 09784260(System.Object[])->

08796c78(System.Collections.Generic.Dictionary`2[[System.IntPtr, mscorlib],[System.Object, mscorlib]])->

09788260(System.Collections.Generic.Dictionary`2+Entry[[System.IntPtr, mscorlib],[System.Object, mscorlib]][])->

087b1e90(System.Windows.Controls.ControlTemplate)->

087b1a80(SilverlightVisualTreeRemovalFail.SilverlightControl1)

Encontramos que el objeto (087b1a80) está referenciado por otro objeto y en lo alto de la lista podemos encontrar cual es el objeto que lo está referenciando.

Ahora que hemos identificado que el objeto está referenciado por un GCHandle pineado el recolector siempre encontrará un camino hasta este objeto haciendo que nunca sea recolectado. Como el código que controla esta funcionalidad es de Microsoft no podemos hacer nada al respecto, pero en caso de que sea nuestro lo que podemos hacer es simplemente eliminar las referencias para que el objeto sea recolectado.

Además podemos volcar todos los tipos que hay en el heap y abrirlo con el CLRProfiler usando !traverseheap.

Saludos.

Luis Guerrero.

Trabajando con Heap Corruptions in .NET

Una de las mejores características de .NET Framework es la administración automática de la memoria, eso significa que no tenemos que estar pendientes de memory leaks, corrupciones y demás problemas. Pero en este artículo encontraremos que esto no es así todas las veces. Os quiero mostrar un bug que he encontrado en una aplicación .NET 4.

Como ya sabreis el clr tiene una heap administrado que contiene todos los objetos que se han ido creando en todo el código ejecutado, y es precisamente en ese managed heap donde el recolector de basura trabaja para ordenarlo y limpiarlo. Vamos a utilizar algunos comandos de WinDBG para ver el estado del heap

Durante la ejecución de mi aplicación aleatoriamente la aplicación me lanza un System.ExecutionEngineException. Como se puede imaginar esta excepción es fatal y no hay oportunidad para cachearla así que mi aplicación se cierra cuando se encuentra con una excepción como esta.

0:281> !threads
ThreadCount:      325
UnstartedThread:  0
BackgroundThread: 268
PendingThread:    0
DeadThread:       56
Hosted Runtime:   no
                                           PreEmptive                                                   Lock
       ID  OSID        ThreadOBJ     State GC       GC Alloc Context                  Domain           Count APT Exception
   0    1   f74 00000000001b47b0      6020 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 STA
   2    2  3ddc 00000000001baaf0      b220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Finalizer)
   5    3  3f44 0000000000fb8ee0   100a220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
   7    4  2acc 000000001c75c120   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
   8    5   f2c 000000001c75c830   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
   9    6  1bf4 000000001c75cf40   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  10    7  1e10 000000001c75ea80   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX    9       000000001c7f8dd0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  12    b  1a9c 000000001c814830   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  13    d  1f50 000000001df31e80   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  14    a  21b4 000000001c7fdd10   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  15    f  2d54 000000001df31160   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  18   10  3edc 000000001df4ef50      b220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     1 MTA
  19   12  3ffc 000000001df60bd0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  20    e   958 000000001df612e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  21    c  2be0 000000001df62100   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  22   14  1920 000000001df62f20   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  23   11  39f0 000000001df619f0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  24   15  2e00 000000001df63630   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   16       000000001df63d40   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  25   17   734 000000001df64450   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  26   18  2c78 000000001df64b60   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   19       000000001df65270   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 Ukn (Threadpool Worker)
  27   1a  2330 000000001df62810   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  28   1c  20f4 000000001df667a0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   13       000000001df66090   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   1e       000000001df675c0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  29   1b  360c 000000001df66eb0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  30   1d  1f04 000000001df67cd0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  31    8   ce0 000000001df65980   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  32   20  3a94 000000001df34070   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  33   21  2ce8 000000001df34780   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  34   22  3dd4 000000001df355a0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  35   24  31c8 000000001df363c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  36   26  15d0 000000001df371e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  37   23  3aec 000000001df35cb0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  38   27  33b8 000000001df378f0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  39   1f   afc 000000001df34e90   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  40   28   9b8 000000001df683e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  41   29  1ba8 000000001c81e7c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   2a       000000001c81f5e0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  42   25  3cbc 000000001c81eed0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  43   2c  20fc 000000001df36ad0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  44   2d  290c 000000001c8573d0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (GC) (Threadpool Worker) System.ExecutionEngineException (0000000002871228)
  45   2b  2f58 000000001c81fcf0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  46   2f  33b4 000000001c8581f0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   2e       000000001c858900   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 Ukn (Threadpool Worker)
  47   31  1020 000000001c859010   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   32       000000001c859720   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 Ukn (Threadpool Worker)
  48   33   ad8 000000001c859e30   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  49   34  3230 000000001c85a540   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  50   35  1a74 000000001c85ac50   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  51   36  3650 000000001c8064f0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  52   37  2890 000000001c806c00   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   38       000000001c807310   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  53   39  1c20 000000001c807a20   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   3a       000000001dfe2860   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  54   3b  1694 000000001dfe2f70   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  55   3d  37b8 000000001dfe3d90   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   30       000000001dfe44a0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   3e       000000001dfe4bb0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  56   3f  18b8 000000001dfe52c0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  57   40  11b0 000000001dfe59d0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  58   41  1ee0 000000001dfe60e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   42       000000001c857ae0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  59   43  27e8 000000001e0c80b0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  60   44   a84 000000001e0c87c0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  61   46  1ba4 000000001e0c95e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  62   48  2160 000000001e0ca400   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  63   4a  2bdc 000000001e0cb220   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  64   47  12d0 000000001e0c9cf0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  65   49   be4 000000001e0cab10   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  66   3c  186c 000000001e0cb930   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   4b       000000001dfe3680   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  67   45  3498 000000001e0c8ed0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   4d       000000001e19b9a0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  68   4e  1550 000000001e19c0b0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  69   50  313c 000000001e19ced0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   51       000000001e19d5e0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   4f       000000001e19c7c0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  70   52  20bc 000000001e19dcf0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  71   4c  33fc 000000001e19b290   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  72   54  2380 000000001e19eb10   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  73   53   a04 000000001e19e400   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  74   56  2028 000000001e22f050   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  75   58  3df0 000000001e22fe70   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   57       000000001e230580   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  76   55  1d08 000000001e22f760   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   5a       000000001e230c90   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  77   5c  373c 000000001e231ab0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   59       000000001e22e940   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 Ukn (Threadpool Worker)
  78   5d   e90 000000001e2321c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   5e       000000001e2ba200   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  79   5f  1358 000000001e2ba910   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   5b       000000001e2bb020   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  80   60  1a98 000000001e2bb730   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  81   61  26f4 000000001e2bbe40   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  82   62   abc 000000001e2bc550   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  83   63  19d4 000000001e2bcc60   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  84   64  1220 000000001e2bd370   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  85   65  1e6c 000000001e2bda80   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  86   66  162c 000000001e2313a0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   67       000000001e2de370   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  87   68  3040 000000001e2dea80   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  88   6a  139c 000000001e2df8a0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  89   6b  39f4 000000001e2dffb0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  90   6c  375c 000000001e2e06c0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  91   6d  1548 000000001e2e0dd0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  92   6e  2920 000000001e2e14e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   6f       000000001e2e1bf0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  93   70  376c 000000001e2e6370   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   71       000000001e2e6a80   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  94   72  14ec 000000001e2e7190   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   75       000000001e2e78a0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  95   73  1930 000000001e2e86c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  96   76  17dc 000000001e2e8dd0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  97   74   c88 000000001e2e7fb0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  98   77   d0c 000000001e2e94e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   78       000000001e2e9bf0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   7a       0000000024ddd4c0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
  99   7b  2878 0000000024dddbd0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 100   79  1278 0000000024dde2e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 101   7c  2358 0000000024ddcdb0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   7d       0000000024dde9f0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 102   7e  28a8 0000000024ddf100   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 103   7f  1778 0000000024ddf810   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 104   80  2990 0000000024ddff20   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 105   81  1864 0000000024de0630   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 106   82  3dc4 0000000024de4db0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 107   83  371c 0000000024de54c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 108   84  3e80 0000000024de5bd0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 109   85  3634 0000000024de62e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 110   86  3908 0000000024de69f0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 111   87  2998 0000000024de7100   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 112   88  200c 0000000024de7810   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 113   89  3370 0000000024de7f20   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 114   8a  33dc 0000000024de8630   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 115   8b  1b98 0000000024df2a90   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 116   8c  1378 0000000024df31a0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 117   8d  3e0c 0000000024df38b0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   8e       0000000024df3fc0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 118   8f  3444 0000000024df46d0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 119   90  3044 0000000024df4de0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   91       0000000024df54f0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 120   92  389c 0000000024df5c00   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 121   93  3938 0000000024df6310   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   95       0000000024e8d5b0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 122   96  18e0 0000000024e8dcc0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 123   97  3954 0000000024e8cea0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 124   98  329c 0000000024e8e3d0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 125   94  2cf0 0000000024e8eae0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 126   9a  3d18 0000000024e8f900   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 127   9b   a80 0000000024e8f1f0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 128   9c  13ac 0000000024e90720   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 129   99  2f84 0000000024e90010   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   9e       000000001e0f9180   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   9f       000000001e0f8a70   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 130   a0  2a20 000000001e0f9fa0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   9d       000000001e0f9890   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 131   a3  2544 000000001e0fb4d0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 132   a1  2910 000000001e0fa6b0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 133   a4   a9c 000000001e0fadc0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 134   a5  1880 000000001e0fbbe0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 135   a6  2d28 0000000024f038f0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 136   a7  12d4 0000000024f04710   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   a8       0000000024f04e20   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 137   a9  11c8 0000000024f05530   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 138   ab  2d4c 0000000024f06350   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 139   aa  1bf8 0000000024f05c40   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 140   a2   244 0000000024f04000   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 141   ac  2688 0000000024f06a60   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 142   ad  27e0 0000000024f07170   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 143   ae  315c 000000001e0fc2f0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   af       000000002501d670   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 144   b0   7bc 000000002501dd80   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 145   b3  1294 000000002501f2b0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 146   b4  3e94 000000002501f9c0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 147   b5   fc8 00000000250200d0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 148   b6   d48 00000000250207e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 149   b7  1f84 0000000025020ef0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 150   b8  3138 0000000025021600   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 151   b9  3214 0000000025021d10   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 152   ba  175c 0000000025022420   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 153   bb  3a24 0000000025022b30   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 154   bc  340c 0000000025023240   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   bd       0000000025023950   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 155   be  27b4 0000000025024060   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 156   bf  2c54 0000000025024770   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 157   c0  3698 0000000025024e80   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 158   c1  20f0 0000000025064a30   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 159   c2   1dc 0000000025065140   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 160   c3  2378 0000000025065850   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 161   c4  1444 0000000025065f60   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   c5       0000000025066670   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   c6       0000000025066d80   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 162   c7   b0c 0000000025067490   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 163   c8  30f4 0000000025067ba0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 164   c9  3d60 00000000250682b0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 165   ca  108c 00000000250689c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 166   cb  37b0 00000000250690d0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   cc       00000000250697e0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 167   b1   dc0 0000000025069ef0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 168   b2  3ed4 000000002506a600   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   cd       000000002506ad10   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 169   ce   c38 000000002506b420   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 170   cf  24cc 000000002506bb30   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   d0       000000002506c240   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 171   d1  1d80 000000002501e490   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 172   d2  1edc 000000002501eba0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 173   d3  304c 000000002513cbf0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 174   d4  3b08 000000002513d300   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 175   d7  3adc 000000002513e830   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   d8       000000002513ef40   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 177   69  2178 000000002513da10   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 178   d6  3b40 000000002513e120   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 179   d9   f28 000000002513fd60   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 180   da  382c 0000000025140470   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   db       0000000025140b80   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 181   dc   b88 0000000025141290   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 182   dd  22ac 00000000251419a0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 183   df  1aac 00000000251427c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 184   e0  353c 0000000025142ed0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   d5       000000002513f650   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 185   de  319c 00000000251420b0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   e1       00000000251435e0   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 186   e2  3678 0000000025143cf0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 187   e3  13fc 0000000025144400   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 188   e4  3038 000000001e2df190   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 189   e5  3cc0 0000000024e5ae20   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 190   e6  3384 0000000024e5b530   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 191   e7  301c 0000000024e5bc40   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 192   e8  3448 0000000024e5c350   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 193   e9  2bcc 0000000024e5ca60   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   ea       0000000024e5d170   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   eb       0000000024e5d880   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX   ec       0000000024e5df90   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 194   ed  1d04 0000000024e5e6a0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 195   ee   c54 000000002523fed0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 196   ef  2220 00000000252405e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 197   f0  2b60 0000000025240cf0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 198   f1  2d88 0000000025241400   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 199   f2  3ee8 0000000025241b10   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 200   f3  3f2c 0000000025242220   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 201   f4  1240 0000000025242930   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 202   f6  23dc 0000000025243750   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 203   f7   a74 0000000025243040   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 204   f8  3f40 0000000025243e60   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 205   f9  2f94 0000000025244c80   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 206   fa   fa4 0000000025245390   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 207   fb  2c7c 0000000025245aa0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 208   f5  2a30 0000000025244570   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 209   fe  102c 0000000025246fd0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX  100       0000000025384550   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 210   fd   c28 00000000252461b0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 211   ff  233c 0000000025384c60   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 212  101  3c34 00000000252476e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX  102       0000000025385a80   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 213  104  1ad4 00000000253868a0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 214   fc  2ef0 0000000025385370   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 215  103  16bc 0000000025386190   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 216  105   990 0000000025386fb0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 218  107  3b38 0000000025387dd0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 219  108   974 00000000253884e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 220  109  10e4 0000000025388bf0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 221  10a  1280 0000000025389300   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 222  10b  1494 00000000253876c0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 223  106  25ac 0000000025389a10   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 224  10e  2b94 000000002538af40   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 225  10c  3218 000000002538a830   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 226  110  2a5c 000000002538bd60   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 227  10d  2d90 000000002538b650   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 228  10f   e10 00000000252468c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 229  112  21bc 0000000025464400   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 230  113  13e4 0000000025464b10   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 231  114  2d84 0000000025465220   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 232  115  3e98 0000000025465930   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 233  116  115c 0000000025466040   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 234  117  1228 0000000025466750   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX  118       0000000025466e60   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 235  119  3054 0000000025467570   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 236  11a  10f4 0000000025467c80   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 237  11b  18b4 0000000025468390   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 238  11c  3a1c 0000000025468aa0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 239  11d  187c 00000000254691b0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 240  11e  342c 00000000254698c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 241  11f  12f4 0000000025469fd0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 242  120  2a04 000000002546a6e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 243  121  36dc 000000002546adf0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 244  122   ffc 000000002546b500   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 245  123   c70 000000002546bc10   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 246  124  39f8 000000002546c400   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 247  125  34c4 000000002546cb10   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX  126       000000002546d220   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 248  127   ae0 000000002546d930   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 249  129  17fc 000000002546ee60   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 250  12b  2288 000000002546f570   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 251  111  2fa0 000000002546e750   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX  12a       000000002546fc80   1019820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 252  128  3160 0000000025470aa0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 253  12c  1fd8 000000002546e040   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 256  12d  13bc 0000000025472df0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 258  12e   fc0 00000000254718c0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 259  12f  2d34 0000000025471fd0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 260  130  366c 00000000254726e0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 261  131   af0 00000000254711b0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 262  132  2bbc 0000000025470390   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 263  133   ae8 0000000025473500   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 264  134  37b4 0000000025473c10   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 265  135  1e54 000000002538a120   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 266  136  3fa0 0000000033dbb290   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 267  137  2698 0000000033dbb9a0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 268  138   ec0 0000000033dbc0b0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 269  139   d30 0000000033dbc7c0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 270  13a   cc8 0000000033dbced0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 271  13b  29f4 0000000033dbd5e0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 272  13c  2c74 0000000033dbdcf0   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 273  13d  3150 0000000033dbe400   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 274  13e  27c4 0000000033dbeb10   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 275  13f  1ee8 0000000033dbf220   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 276  140  1dec 0000000033dbf930   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 277  141  3398 0000000033dc0040   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 278  14a  274c 0000000033e073f0   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 279  14b  1d50 0000000033e08210   3009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
 280  149  1258 0000000033e07b00   1009220 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 MTA (Threadpool Worker)
XXXX  148       0000000033e06ce0     19820 Enabled  0000000000000000:0000000000000000 00000000001a85b0     0 Ukn

Como vemos en esta salida de WinDBG tenemos varios thread y en el thread 44 hay una excepción (GC) (Threadpool Worker) System.ExecutionEngineException (0000000002871228) y esta dirección es la dirección de memoria donde es el System.ExecutionEngineException. Empecemos la investigación desde ahí.

0:281> !pe 0000000002871228
Exception object: 0000000002871228
Exception type:   System.ExecutionEngineException
Message:          <none>
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131506
The current thread is unmanaged

Ahora como siempre examinemos las pilas nativas y administrada.

0:044> !clrstack
OS Thread Id: 0x290c (44)
Child SP         IP               Call Site
000000002191d9b8 000007fef3fecca3 [HelperMethodFrame: 000000002191d9b8] 
000000002191dc30 000007fef2f394b7 System.Text.StringBuilder.ToString()
000000002191dc80 000007feed584193 System.Data.Query.PlanCompiler.CTreeGenerator.ResolveVar(System.Data.Query.InternalTrees.Var)
000000002191dd40 000007feed5845fe System.Data.Query.PlanCompiler.CTreeGenerator.CreateProject(RelOpInfo, System.Collections.Generic.IEnumerable`1<System.Data.Query.InternalTrees.Var>)
000000002191de10 000007feed587e49 System.Data.Query.PlanCompiler.CTreeGenerator.Visit(System.Data.Query.InternalTrees.PhysicalProjectOp, System.Data.Query.InternalTrees.Node)
000000002191deb0 000007feed58582c System.Data.Query.PlanCompiler.CTreeGenerator..ctor(System.Data.Query.InternalTrees.Command, System.Data.Query.InternalTrees.Node)
000000002191df10 000007feed5725f1 System.Data.Query.PlanCompiler.ProviderCommandInfoUtils.Create(System.Data.Query.InternalTrees.Command, System.Data.Query.InternalTrees.Node, System.Collections.Generic.List`1<System.Data.Query.PlanCompiler.ProviderCommandInfo>)
000000002191df60 000007feed536485 System.Data.Query.PlanCompiler.CodeGen.Process(System.Collections.Generic.List`1<System.Data.Query.PlanCompiler.ProviderCommandInfo> ByRef, System.Data.Query.InternalTrees.ColumnMap ByRef, Int32 ByRef)
000000002191dfe0 000007feed4b4d90 System.Data.Query.PlanCompiler.PlanCompiler.Compile(System.Collections.Generic.List`1<System.Data.Query.PlanCompiler.ProviderCommandInfo> ByRef, System.Data.Query.InternalTrees.ColumnMap ByRef, Int32 ByRef, System.Data.Common.Utils.Set`1<System.Data.Metadata.Edm.EntitySet> ByRef)
000000002191e0d0 000007feed54418e System.Data.EntityClient.EntityCommandDefinition..ctor(System.Data.Common.DbProviderFactory, System.Data.Common.CommandTrees.DbCommandTree)
000000002191e270 000007feed62aae4 System.Data.EntityClient.EntityProviderServices.CreateDbCommandDefinition(System.Data.Common.DbProviderManifest, System.Data.Common.CommandTrees.DbCommandTree)
000000002191e2b0 000007feed5cf34d System.Data.Objects.Internal.ObjectQueryExecutionPlan.Prepare(System.Data.Objects.ObjectContext, System.Data.Common.CommandTrees.DbQueryCommandTree, System.Type, System.Data.Objects.MergeOption, System.Data.Objects.Span, System.Collections.ObjectModel.ReadOnlyCollection`1<System.Collections.Generic.KeyValuePair`2<System.Data.Objects.ObjectParameter,System.Data.Objects.ELinq.QueryParameterExpression>>)
000000002191e3b0 000007feed5fec9a System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(System.Nullable`1<System.Data.Objects.MergeOption>)
000000002191e4b0 000007feed610a65 System.Data.Objects.ObjectQuery`1[[System.__Canon, mscorlib]].GetResults(System.Nullable`1<System.Data.Objects.MergeOption>)
000000002191e530 000007feed6117cf System.Data.Objects.ObjectQuery`1[[System.__Canon, mscorlib]].System.Collections.Generic.IEnumerable<T>.GetEnumerator()
000000002191e580 000007feef066e79 System.Linq.Enumerable.First[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1<System.__Canon>)
000000002191e5e0 000007feef081daf System.Linq.Queryable.First[[System.__Canon, mscorlib]](System.Linq.IQueryable`1<System.__Canon>)
000000002191e640 000007ff00416efa ServerDetection.Data.DataAccess.UpdateSever(ServerDetection.Server)
000000002191e940 000007ff004133b6 ServerDetection.StreamRulesEngine.ExploreServer(ServerDetection.Server)
000000002191eb50 000007ff00412f2c ServerDetection.StreamRulesEngine.<CreateTask>b__15(System.Object)
000000002191eb90 000007fef36796bb System.Threading.Tasks.Task.Execute()
000000002191ebf0 000007fef2f60d3c System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
000000002191ec50 000007fef3679455 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)
000000002191ecd0 000007fef367d9d0 System.Threading.Tasks.Task.ExecuteEntry(Boolean)
000000002191ed10 000007fef2f96be8 System.Threading.ThreadPoolWorkQueue.Dispatch()
000000002191eda0 000007fef2f96a85 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
000000002191f3f0 000007fef3e621b4 [DebuggerU2MCatchHandlerFrame: 000000002191f3f0] 
0:044> kb 2000
RetAddr           : Args to Child                                                           : Call Site
000007fe`f3feaf0a : 00000000`00000001 00000000`00000000 000007fe`00000002 000007fe`00000001 : clr!WKS::gc_heap::plan_phase+0x454
000007fe`f3feb6a5 : 000000d4`19ef3257 00000000`2191d629 00000000`00000001 00000000`00000001 : clr!WKS::gc_heap::gc1+0xbb
000007fe`f3feb35e : 00000000`00193900 000007fe`00000000 00000000`00000000 00000000`00000000 : clr!WKS::gc_heap::garbage_collect+0x276
000007fe`f3fe9c18 : 00000000`1c857440 00000000`00000088 000007fe`f3e30000 00000000`09350d00 : clr!WKS::GCHeap::GarbageCollectGeneration+0x14e
000007fe`f3fe929e : 00000000`000000a8 000007fe`f46c3700 00000000`2191d800 00000000`1c857440 : clr!WKS::gc_heap::try_allocate_more_space+0x25f
000007fe`f3ee4a95 : 00000000`00000088 00000000`00193900 00000000`1c857440 00000000`2191dca0 : clr!WKS::GCHeap::Alloc+0x7e
000007fe`f2f394b7 : 00000000`08000001 00000000`09351c00 00000000`030d39f0 00000000`0934f478 : clr!FramedAllocateString+0xb19
000007fe`ed584193 : 00000000`09350e88 00000000`09350d00 00000000`0300b1a8 00000000`09350e88 : mscorlib_ni+0x3694b7
000007fe`ed5845fe : 00000000`09350e08 00000000`093405d0 00000000`000000fa 00000000`00000000 : System_Data_Entity_ni+0x854193
000007fe`ed587e49 : 00000000`0934f478 00000000`09350ce8 00000000`00000000 000007fe`f3e98733 : System_Data_Entity_ni+0x8545fe
000007fe`ed58582c : 00000000`0934f478 00000000`0934bff0 00000000`093382d8 000007fe`ed5734c8 : System_Data_Entity_ni+0x857e49
000007fe`ed5725f1 : 00000000`2191def0 000007fe`f3e701ff 00000000`00000000 00000000`2191e1c8 : System_Data_Entity_ni+0x85582c
000007fe`ed536485 : 00000000`09334420 000007fe`ed3ed8b9 00000000`0934f450 00000000`2191e050 : System_Data_Entity_ni+0x8425f1
000007fe`ed4b4d90 : 00000000`00000000 00000000`00000000 00000000`02de9628 00000000`1288f490 : System_Data_Entity_ni+0x806485
000007fe`ed54418e : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : System_Data_Entity_ni+0x784d90
000007fe`ed62aae4 : 00000000`093341a0 00000000`062e3608 00000000`09333ef8 00000000`09333ef8 : System_Data_Entity_ni+0x81418e
000007fe`ed5cf34d : 00000000`09333f28 000007fe`ed3f0a59 00000000`04f1db88 000007fe`f2f46f83 : System_Data_Entity_ni+0x8faae4
000007fe`ed5fec9a : 00000000`062e3608 000007ff`003d27e8 00000000`02db2aa0 0000635b`00000000 : System_Data_Entity_ni+0x89f34d
000007fe`ed610a65 : 00000000`04f1db88 00000000`00000000 000007ff`002ae568 00000000`2191e0b8 : System_Data_Entity_ni+0x8cec9a
000007fe`ed6117cf : 00000000`04f1dbe8 000007ff`00489730 000007fe`eeefa86f 00000000`00000000 : System_Data_Entity_ni+0x8e0a65
000007fe`ef066e79 : 00000000`062e7bc8 00000000`090f7a68 00000000`090f7a68 000007fe`ed5ff21f : System_Data_Entity_ni+0x8e17cf
000007fe`ef081daf : 000007ff`00489730 000007ff`00489430 00000000`09124478 00000000`08ee3668 : System_Core_ni+0x456e79
000007ff`00416efa : 000007ff`00488e40 00000000`00000000 00000000`08ed3048 00000000`12871030 : System_Core_ni+0x471daf
000007ff`004133b6 : 00000000`02dc41e8 00000000`0603a228 00000000`033d1008 000007fe`f383ea3c : 0x7ff`00416efa
000007ff`00412f2c : 00000000`02db1118 00000000`0603a228 00000000`2191ec88 000007fe`f3e7063c : 0x7ff`004133b6
000007fe`f36796bb : 00000000`02db1118 00000000`0603a228 00000000`0603a3a8 000007fe`f2f61545 : 0x7ff`00412f2c
000007fe`f2f60d3c : 00000000`0603a3a8 00000000`1c8573d8 00000000`2191ec40 000007fe`f3e6ed1e : mscorlib_ni+0xaa96bb
000007fe`f3679455 : 00000000`12871030 00000000`0603a3a8 00000000`2191ec88 00000000`00000001 : mscorlib_ni+0x390d3c
000007fe`f367d9d0 : 00000000`0603a3a8 00000000`033d1018 00000000`0603a3a8 000007fe`f2fe71a9 : mscorlib_ni+0xaa9455
000007fe`f2f96be8 : 000007fe`f2c4e7f8 00000000`2191f140 000007ff`00022020 00000000`0316bf48 : mscorlib_ni+0xaad9d0
000007fe`f2f96a85 : 48cc31a4`460aef00 00000000`09103290 00000000`00000000 00000004`00000005 : mscorlib_ni+0x3c6be8
000007fe`f3e621b4 : 48cc31a4`460aef03 000007fe`f2f66e32 00000000`09103200 00000001`000001bb : mscorlib_ni+0x3c6a85
000007fe`f3e67129 : 00000000`2191f208 00000000`02db11e0 00000000`21910000 00000000`00000000 : clr!CallDescrWorker+0x84
000007fe`f3e671a3 : 00000000`2191ef48 00000000`00000000 00000000`2191ef50 00000000`00000000 : clr!CallDescrWorkerWithHandler+0xa9
000007fe`f3e6c5b5 : 00000000`2191f6a8 00000000`2191f4c8 00000000`1c8573d0 00000000`00000001 : clr!MethodDesc::CallDescr+0x2f4
000007fe`f403c42f : 00000000`2191f6a8 00000000`2191f658 00000000`2191f4c8 00000000`00000000 : clr!MethodDescCallSite::CallWithValueTypes_RetArgSlot+0x35
000007fe`f3ef6c5a : ffffffff`fffffffe 000007fe`f3e33489 ffffffff`fffffffe 00000000`1c8573d0 : clr!QueueUserWorkItemManagedCallback+0x44
000007fe`f3ef6bef : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : clr!SystemDomain::LoadBaseSystemClasses+0x43e
000007fe`f3ef6b5c : 00000000`00159770 00000000`2191f380 00000000`00000000 00000000`2191f3c8 : clr!SString::Equals+0x190
000007fe`f403c2f9 : ffffffff`ffffffff 00000000`1c8573d0 00000000`00000000 000007fe`f3e333eb : clr!CParseUtils::TrimWhiteSpace+0x119
000007fe`f3f04bf5 : 00000000`00000c0a 00000000`00000000 00000000`1c8573d0 000007fe`f3ecd2d0 : clr!ManagedPerAppDomainTPCount::DispatchWorkItem+0xe6
000007fe`f4004377 : 00000000`00000000 00000000`1dfa6501 000000f2`00f200f2 00000000`00000c0a : clr!ThreadpoolMgr::NewWorkerThreadStart+0x49f
000007fe`f4002c22 : 00000000`00000000 00000000`00000000 00000000`2191f7a0 00000000`00000000 : clr!ThreadpoolMgr::WorkerThreadStart+0x3b
00000000`76e9f56d : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : clr!Thread::intermediateThreadProc+0x7d
00000000`770d3281 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd
00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d

En mi pila administrada mi último frame es System.Text.StringBuilder.ToString(), así que asumimos que estamos creando memoria para ese string. Si miramos a la pila nativa observamos que justo en ese punto se estaba haciendo una recolección de basura.

La secuencia es: FramedAllocateString -> GCHeap::Alloc -> gc_heap::try_allocate_more_space -> GCHeap::GarbageCollectGeneration -> gc_heap::garbage_collect -> :gc_heap::gc1

Este punto estamos seguros de que realmente se estaba reservando memoria para ese string, pero como no habría más memoria disponible se había lanzado una recolección de basura y ahí es donde el runtime encontró la corrupción del heap.

Hay un commando muy util en WinDBG !verifyheap que nos permite comprobar que hay signos de corrupción en el heap adminsitrado.

0:044> !verifyheap
-verify will only produce output if there are errors in the heap
The garbage collector data structures are not in a valid state for traversal.
It is either in the "plan phase," where objects are being moved around, or
we are at the initialization or shutdown of the gc heap. Commands related to 
displaying, finding or traversing objects as well as gc heap segments may not 
work properly. !dumpheap and !verifyheap may incorrectly complain of heap 
consistency errors.
object 0000000006fb6ec8: bad member 0000000008f1b750 at 0000000006fb6ef8
curr_object:      0000000006fb6ec8
Last good object: 0000000006fb6e50
----------------

El commando !verifyheap nos está diciendo que en ese preciso momento se estaba realizando una recolección de basura que las estructuras del gc puede que no estén en un estado válido para que este comando extraiga toda la información, pero al final del reporte encontramos que hay un objeto que tiene un miembro inválido, este objeto es un System.IO.StreamReader y el miembro invalido es System.Char[] 0000000008f1b750 charBuffer.

0:044> !do 0000000006fb6ec8
<Note: this object has an invalid CLASS field>
Name:        System.IO.StreamReader
MethodTable: 000007fef30951a0
EEClass:     000007fef2cce0d0
Size:        96(0x60) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fef30d9518  40001cd        8        System.Object  0 instance 0000000000000000 __identity
000007fef3091d08  4001fda      c80 System.IO.TextReader  0   shared           static Null
                                 >> Domain:Value  00000000001a85b0:NotInit  <<
000007fef30dd718  4001fde       54       System.Boolean  1 instance                1 _closable
000007fef30e3658  4001fdf       10     System.IO.Stream  0 instance 0000000006fb6e50 stream
000007fef30e3968  4001fe0       18 System.Text.Encoding  0 instance 00000000032d6848 encoding
000007fef30ac110  4001fe1       20  System.Text.Decoder  0 instance 0000000006fb6f28 decoder
000007fef30e0d00  4001fe2       28        System.Byte[]  0 instance 0000000008f1a738 byteBuffer
000007fef30db4a8  4001fe3       30        System.Char[]  0 instance 0000000008f1b750 charBuffer
000007fef30e0d00  4001fe4       38        System.Byte[]  0 instance 000000000287ff88 _preamble
000007fef30dc918  4001fe5       40         System.Int32  1 instance                0 charPos
000007fef30dc918  4001fe6       44         System.Int32  1 instance                0 charLen
000007fef30dc918  4001fe7       48         System.Int32  1 instance                0 byteLen
000007fef30dc918  4001fe8       4c         System.Int32  1 instance                0 bytePos
000007fef30dc918  4001fe9       50         System.Int32  1 instance             4096 _maxCharsPerBuffer
000007fef30dd718  4001fea       55       System.Boolean  1 instance                1 _detectEncoding
000007fef30dd718  4001feb       56       System.Boolean  1 instance                0 _checkPreamble
000007fef30dd718  4001fec       57       System.Boolean  1 instance                0 _isBlocked
000007fef30951a0  4001fdd      c88 ...m.IO.StreamReader  0   shared           static Null
                                 >> Domain:Value  00000000001a85b0:NotInit  <<

¿Qué podemos hacer con este problema?

Teniendo en cuenta que es un problema de corrupción en la pila lo que tenemos que hacer es simplemente llamar al servicio de soporte de Microsoft y notificarle lo que hemos encontrado.

Happy debugging. Luis.

¿De donde sale este DataRow?

Hace poco gracias al equipo DOT de PlainConcepts, tuve oportunidad de participara en un caso muy interesante, el software de la empresa en cuestión tenía un problema de fuga de memoria porque las referencias de los objetos no eran recolectadas por el GC, así que WinDGB en mano me puse a averiguar porque era.

Una de las primeras cosas que se hace cuando te encuentras un caso como este es intentar que la aplicación que vas a depurar se encuentre en ese caso, ósea que este fugando memoria, en mi caso lo era así que el segundo paso es hacer un dump completo de la aplicación. Esto lo podemos hacer con una herramienta que viene en la carpeta de instalación del “Debugging tools for Windows” que se llama ADPlus.vbs, la sintaxis sería la siguiente:

adplus -hang -pn miprograma.exe

Una vez hecho eso tenemos un dump completo de la aplicación en el estado de fuga de memoria que os comentaba antes, ahora tenemos que ponernos a investigar. Una de las cosas que suelo hacer siempre que me encuentro con un caso de fuga de memoria es hacer un !dumpheap para ver que nos encontramos en el heap (monton) de .NET, que es básicamente donde están todos los objetos que se instancian en el ciclo de vida de una aplicación .NET.

Aquí podemos ver el resultado en WinDBG:

0:003> !dumpheap -stat
total 5003168 objects
Statistics:
      MT    Count    TotalSize Class Name
6b441898        1           12 System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib]]
6b440b48        1           12 System.Security.Permissions.ReflectionPermission
6b43f850        1           12 System.Resources.FastResourceComparer
6b43ccec        1           12 System.__Filters
6b43cc9c        1           12 System.Reflection.Missing
6b43cba4        1           12 System.RuntimeType+TypeCacheQueue
6b43bcb8        1           12 System.Runtime.InteropServices.GCHandle
6b439cf0        1           12 System.RuntimeTypeHandle
6b4382c8        1           12 System.Text.DecoderExceptionFallback
6b438284        1           12 System.Text.EncoderExceptionFallback
6b41c7a8        1           12 System.Security.Permissions.FileDialogPermission
6b41c76c        1           12 System.Security.PolicyManager
6b41abec        1           12 System.Reflection.__Filters
6b41a004        1           12 System.DBNull
61e8508c        1           12 System.Data.IndexField[]
61e7f984        1           12 Bid+BindingCookie
00584a78        1           12 DataRowMemoryLeak.Foo
6ba6bc08        1           16 System.IO.TextReader+SyncTextReader
6b440ca0        1           16 System.Enum+HashEntry
6b43fad4        1           16 System.Resources.ResourceReader+TypeLimitingDeserializationBinder
6b43a0d8        1           16 System.Int64
6b439ef0        1           16 System.Globalization.GlobalizationAssembly
6b417760        1           16 System.Security.Permissions.UIPermission
61e85f8c        1           16 System.Data.DataRowBuilder
6b445bd4        1           20 System.Environment+ResourceHelper
6b441bac        1           20 System.Security.Permissions.EnvironmentPermission
6b438988        1           20 System.Text.StringBuilder
6b437a6c        1           20 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
6b437a14        1           20 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
6b437988        1           20 System.Text.InternalEncoderBestFitFallback
61e85754        1           20 System.Data.DataRowCollection
61e7f9c0        1           20 Bid+AutoInit
6b4447e8        1           24 System.Collections.BitArray
6b441914        1           24 System.String[][]
6b440e8c        2           24 System.OrdinalComparer
6b43a470        1           24 System.OperatingSystem
6b437d2c        1           24 System.IO.TextWriter+SyncTextWriter
6b4379d4        1           24 System.Text.InternalDecoderBestFitFallback
6b421078        1           24 System.Collections.Generic.List`1[[System.Int32, mscorlib]]
6b4192a0        1           24 System.Collections.Generic.List`1[[System.WeakReference, mscorlib]]
6b417bb0        1           24 System.Collections.Stack
61e85e44        1           24 System.Collections.Generic.List`1[[System.Data.Index, System.Data]]
61e854f8        1           24 System.Collections.Generic.List`1[[System.Data.DataViewListener, System.Data]]
61e8520c        1           24 System.Collections.Generic.List`1[[System.Data.DataView, System.Data]]
61e7da60        1           24 <CrtImplementationDetails>.ModuleUninitializer
6b43ecb4        1           28 System.Text.DecoderNLS
6b438f18        1           28 System.SharedStatics
6b4383a8        1           28 System.IO.Stream+NullStream
6b438188        1           28 System.Text.EncoderNLS
6b437bfc        1           28 Microsoft.Win32.Win32Native+InputRecord
6b441c5c        1           32 System.Text.UnicodeEncoding+Decoder
6b43ec2c        1           32 System.Text.UTF8Encoding+UTF8Decoder
6b43ae5c        1           32 System.Security.PermissionTokenFactory
6b43820c        1           32 System.Threading.IOCompletionCallback
6b438108        1           32 System.Text.UTF8Encoding+UTF8Encoder
6b41cbd8        1           32 System.Security.Util.Tokenizer+StringMaker
6b415650        1           32 System.Runtime.CompilerServices.RuntimeHelpers+CleanupCode
6b4155c4        1           32 System.Runtime.CompilerServices.RuntimeHelpers+TryCode
6b415394        1           32 System.Text.UnicodeEncoding
61e856e4        1           32 System.Data.ConstraintCollection
61e85630        1           32 System.Data.RecordManager
61e7f90c        1           32 Bid+CtrlCB
6b43ac78        1           36 System.Security.Permissions.FileIOPermission
6b43a028        1           36 System.Int64[]
6b41d0e0        3           36 System.Security.Policy.AllMembershipCondition
6b418058        1           36 System.Resources.RuntimeResourceSet
6b43fa50        1           40 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
6b43f694        1           40 System.IO.BinaryReader
6b43d778        2           40 Microsoft.Win32.SafeHandles.SafeFileHandle
6b43adb0        2           40 System.Security.PermissionToken
6b41edfc        1           40 System.Int32[][]
6b439338        1           44 System.AppDomainSetup
6b415be0        1           44 System.Threading.ReaderWriterLock
61e87720        1           44 System.Data.Common.StringStorage
61e875fc        1           44 System.Data.Common.Int32Storage
61e857c4        1           44 System.Data.DataRowCollection+DataRowTree
6b440e18        3           48 System.CultureAwareComparer
6b43d9e4        4           48 System.UInt16
6b43ba44        3           48 System.Text.DecoderReplacementFallback
6b43b9f4        3           48 System.Text.EncoderReplacementFallback
6b43a3f4        2           48 System.Version
6b41d2a0        4           48 System.Security.Permissions.StrongNamePublicKeyBlob
6b43f74c        1           52 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Resources.ResourceLocator, mscorlib]]
6b415314        1           52 System.Resources.ResourceManager
6b43b8f0        2           56 System.Text.UTF8Encoding
6b438e20        1           56 System.Threading.Thread
6b4164b4        1           56 System.LogLevel[]
61e85674        1           56 System.Data.DataColumnCollection
6b440be4        1           60 System.UInt64[]
6b4242f8        1           60 System.IO.StreamReader+NullStreamReader
6b42420c        1           60 System.IO.StreamReader
6b41ac44        2           64 System.Reflection.TypeFilter
6b4190d8        2           64 System.EventHandler
6b43b674        1           68 System.Globalization.CultureTable
6b439d98        3           72 System.Reflection.Assembly
6b438b90        1           72 System.ExecutionEngineException
6b438b00        1           72 System.StackOverflowException
6b438a70        1           72 System.OutOfMemoryException
6b437c50        2           72 System.IO.__ConsoleStream
6b43786c        1           76 System.Text.SBCSCodePageEncoding
6b41d320        5           80 System.Security.Policy.ZoneMembershipCondition
6b41d230        4           80 System.Security.Policy.PolicyStatement
6b417fdc        1           80 System.Resources.ResourceReader
6b43cd48        3           96 System.Reflection.MemberFilter
6b43c23c        2           96 System.Reflection.Module
6b43a72c        8           96 System.Security.Permissions.SecurityPermission
6b4156d4        3           96 System.Globalization.CompareInfo
6b43cc64        1          100 System.Reflection.MetadataArgs+SkipAddresses
6b43b708        5          100 System.Globalization.CultureTableItem
6b43902c        1          100 System.AppDomain
6b4163c0        1          108 System.SwitchStructure[]
6b437e88        2          112 System.IO.StreamWriter
6b416db0        2          120 System.Collections.Hashtable+SyncHashtable
6b439f44        2          128 System.IO.UnmanagedMemoryStream
6b422314        4          128 System.Collections.ArrayList+SyncArrayList
6b417b4c        7          140 Microsoft.Win32.SafeHandles.SafeRegistryHandle
6b43a510        4          144 System.Security.PermissionSet
6b438c20        2          144 System.Threading.ThreadAbortException
6b41f04c        3          156 System.Security.Policy.PolicyLevel
6b43ae10        5          180 System.Security.Util.TokenBasedSet
6b43aa98       17          204 System.Int32
6b41794c        7          224 Microsoft.Win32.RegistryKey
6b43b7b0        2          256 System.Globalization.NumberFormatInfo
6b438468       22          264 System.Object
61e84fb4        2          296 System.Data.DataColumn
61e82cc8        1          296 System.Data.DataTable
6b43b624        7          336 System.Globalization.CultureTableRecord
6b43fc20        1          352 System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.Resources.ResourceLocator, mscorlib]][]
6b41ce18       10          360 System.Security.Policy.UnionCodeGroup
6b43b448        6          408 System.Globalization.CultureInfo
6b41f0a4        9          432 System.Security.NamedPermissionSet
6b43aea0       18         1008 System.Collections.Hashtable
6b41cd3c       65         1560 System.Security.Policy.StrongNameMembershipCondition
6b43b2bc       12         1676 System.Byte[]
6b4399cc      110         2200 System.RuntimeType
6b43af9c       18         2664 System.Collections.Hashtable+bucket[]
6b43947c       24         3444 System.Char[]
6b41cae8      216         6048 System.Security.SecurityElement
6b43a87c      266         6384 System.Collections.ArrayList
61e85bd0      347         9716 System.Data.RBTree`1+TreePage[[System.Data.DataRow, System.Data]]
00466bf0      235       395780      Free
6b43a9e8      368      4455624 System.Int32[]
6b43884c  1000553     31651760 System.String
61e85d88      347     32089008 System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][]
6b414e78      320     37795900 System.Object[]
6b415b88  2999997     47999952 System.WeakReference
61e85048   999999     63999936 System.Data.DataRow
Total 5003168 objects

El caso es que tenía aproximadamente un millón de instancias de la clase System.Data.DataRow, que como bien sabéis representa una fila de un DataTable de ADO.NET, pues resulta que la aplicación por algún motivo seguía teniendo las referencias a esas DataRow.

Ya sabemos cuál es el problema, ahora tenemos que saber desde donde se referencia a esas DataRow y encontrar el trozo de código que lo hace, esto normalmente es lo más complicado porque tiene que conocer el software que estás depurando y en mi caso son clientes externos y no conozco el caso, así que lo que normalmente hago son dos cosas:

· Con el comando !gcroot le paso una dirección de memoria de uno de esos DataRow para ver desde que Thread y que pila se ha referenciado el objeto. Con el identificador del Thread cambio el WinDGB del Thread actual al nuevo thread con el comando “~23s” siendo 23 el identificador del Thread y ahora ejecuto un !clrstack con el que puedo ver la pila administrada del Thread actual. Ahora simplemente tengo que buscar en esas clases y en esos métodos referencias a los DataRows para encontrar la fuente de las referencias. Además puedo utilizar el comando !dso que me permite ver los parámetros de las funciones y las variables locales de todos lo métodos de la pila actual.

0:000> !dso
OS Thread Id: 0x7a0 (0)
ESP/REG  Object   Name
0030ef94 13cff17c Microsoft.Win32.SafeHandles.SafeFileHandle
0030efa4 13cff17c Microsoft.Win32.SafeHandles.SafeFileHandle
0030efd8 13cff3e0 System.Byte[]
0030efdc 13cff190 System.IO.__ConsoleStream
0030effc 13cff1c0 System.IO.StreamReader
0030f000 13cff1c0 System.IO.StreamReader
0030f018 13cff1c0 System.IO.StreamReader
0030f01c 13cff6f8 System.IO.TextReader+SyncTextReader
0030f03c 13cff6f8 System.IO.TextReader+SyncTextReader
0030f060 13cfe1b8 System.Int64
0030f064 1017bd90 System.String    total memory -
0030f068 13cfe1a8 System.WeakReference
0030f06c 0b597af8 System.Data.DataRow
0030f070 0180a954 System.Data.DataRowCollection
0030f074 01866d48 System.Collections.Generic.List`1[[System.WeakReference, mscorlib]]
0030f078 0180a954 System.Data.DataRowCollection
0030f07c 13cfe1ec System.String    total memory - 218038312
0030f080 13cfe1b8 System.Int64
0030f084 1017bd90 System.String    total memory -
0030f088 01866d70 System.Data.DataTable
0030f0a4 01866d3c DataRowMemoryLeak.Foo
0030f0b4 0b597af8 System.Data.DataRow
0030f0b8 0180a954 System.Data.DataRowCollection
0030f0bc 01866d48 System.Collections.Generic.List`1[[System.WeakReference, mscorlib]]
0030f0c0 0180a954 System.Data.DataRowCollection
0030f0c4 01866d70 System.Data.DataTable
0030f0c8 01866d3c DataRowMemoryLeak.Foo
0030f0e8 0b597af8 System.Data.DataRow
0030f0ec 0180a954 System.Data.DataRowCollection
0030f0f0 01866d48 System.Collections.Generic.List`1[[System.WeakReference, mscorlib]]
0030f0f4 0180a954 System.Data.DataRowCollection
0030f0f8 01866d70 System.Data.DataTable
0030f0fc 01866d3c DataRowMemoryLeak.Foo
0030f118 01866d24 System.String    ID
0030f120 0180a954 System.Data.DataRowCollection
0030f12c 01866d08 System.String    Name
0030f13c 01866d24 System.String    ID
0030f148 01866d08 System.String    Name
0030f150 01866d70 System.Data.DataTable
0030f154 01866d3c DataRowMemoryLeak.Foo
0030f158 0b597af8 System.Data.DataRow
0030f15c 01866d70 System.Data.DataTable
0030f160 01866d3c DataRowMemoryLeak.Foo
0030f16c 0180a1dc System.Object[]    (System.String[])
0030f400 0180a1dc System.Object[]    (System.String[])
0:000> !gcroot 088a1630
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
eax: 0030eec4 (invalid object)
Scan Thread 0 OSTHread 7a0
ESP:30eeb4: 0030eec4 (invalid object)
ESP:30f06c:Root:0b597af8(System.Data.DataRow)->
01866d70(System.Data.DataTable)->
0180a954(System.Data.DataRowCollection)->
0180a968(System.Data.DataRowCollection+DataRowTree)->
07f166bc(System.Object[])->
0b033360(System.Data.RBTree`1+TreePage[[System.Data.DataRow, System.Data]])->
088a1630(System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][])

· Si todo esto no funciona también puedo hacer otro tipo de análisis de la aplicación. Con el Reflecto, programa que por cierto todo programador de .net debería de tener, podemos agregar la referencia del ensamblado el cual queremos analizar y el ensamblado de la clase la cual queremos saber si nuestro ensamblado referencia. En este caso miEnsamblado.dll y System.Data.dll que contiene System.Data.DataRow y pulsando el botón contrario encima de la clase tengo la opción de Analyze que me permite ver varias opciones.

  1. Depends On
  2. Used By
  3. Exposed By
  4. Instantiated By

image

 

· Como podréis imaginar las dos que me interesan son Used By y Instantiated By, en este caso Instantiated By no tanto porque no soy el responsable directo de crear las instancias de los DataRow, pero Used By me va a permitir ver de los ensamblados que tengo cargados cuales referencia a esta clase.

image

Así que como podéis ver la vida de un depurador no es fácil pero hay una serie de trucos que os pueden ayudar a solucionar la vida.

Espero que os haya gustado y hasta otra.

Saludos. Luis.

Actualización: (16 enero 2008)

Aquí esta la URL del ejemplo usado con WinDGB, http://www.luisguerrero.net/downloads/DataRowMemoryLeak.zip

Para sacar una dirección de memoria de un objeto y después usarlo para por ejemplo !do (DumpObject) o !gcroot tenemos que usar el comando !dumpheap que nos muestra toda la lista de objetos de hay en el heap (montón).net,SOS,Trucos.

Si hacemos un comando como este: !dumpheap –type System.Data.DataRow tenemos lo siguiente:

Address      MD
0b6d6598 77a95048       64
0b6d65f8 77a95048       64
0b6d6658 77a95048       64
0b6d66b8 77a95048       64
0b6d6718 77a95048       64
0b6d6778 77a95048       64
0b6d67d8 77a95048       64
0b6d6838 77a95048       64
0b6d6898 77a95048       64
0b6d68f8 77a95048       64
0b6d6958 77a95048       64
0b6d69b8 77a95048       64
0b6d6a18 77a95048       64
0b6d6a78 77a95048       64
total 1000696 objects
Statistics:
      MT    Count    TotalSize Class Name
77a95f8c        1           16 System.Data.DataRowBuilder
77a95754        1           20 System.Data.DataRowCollection
77a957c4        1           44 System.Data.DataRowCollection+DataRowTree
77a95bd0      347         9716 System.Data.RBTree`1+TreePage[[System.Data.DataRow, System.Data]]
77a95d88      347     32089008 System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][]
77a95048   999999     63999936 System.Data.DataRow
Total 1000696 objects

0:004> !do 0b6d6a78
Name: System.Data.DataRow
MethodTable: 77a95048
EEClass: 779adf30
Size: 64(0x40) bytes
 (C:\Windows\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
77a92cc8  4000720        4 ...em.Data.DataTable  0 instance 01956d70 _table
77a95674  4000721        8 ...aColumnCollection  0 instance 018fa804 _columns
71ebaa98  4000722       18         System.Int32  1 instance       -1 oldRecord
71ebaa98  4000723       1c         System.Int32  1 instance   999964 newRecord
71ebaa98  4000724       20         System.Int32  1 instance       -1 tempRecord
71ebaa98  4000725       24         System.Int32  1 instance   999965 _rowID
77ea7fc8  4000726       28         System.Int32  1 instance        0 _action
71ebea68  4000727       38       System.Boolean  1 instance        0 inChangingEvent
71ebea68  4000728       39       System.Boolean  1 instance        0 inDeletingEvent
71ebea68  4000729       3a       System.Boolean  1 instance        0 inCascade
77a94fb4  400072a        c ...m.Data.DataColumn  0 instance 00000000 _lastChangedColumn
71ebaa98  400072b       2c         System.Int32  1 instance        0 _countColumnChange
77ec3bf4  400072c       10 ...em.Data.DataError  0 instance 00000000 error
71eb8468  400072d       14        System.Object  0 instance 00000000 _element
71ebaa98  400072e       30         System.Int32  1 instance 22676893 _rbTreeNodeId
71ebaa98  4000730       34         System.Int32  1 instance   999965 ObjectID
71ebaa98  400072f      498         System.Int32  1   static   999999 _objectTypeCount

0:004> !dumpmt 77a95048
EEClass: 779adf30
Module: 779a1000
Name: System.Data.DataRow
mdToken: 02000081  (C:\Windows\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll)
BaseSize: 0x40
ComponentSize: 0x0
Number of IFaces in IFaceMap: 0
Slots in VTable: 99

De la primera columna podemos sacar la dirección del objeto que queremos investigar.

Forzar un BSOD en Windows

Hola a todos de nuevo !!

Cualquiera me puede decir que el título del post es un poco raro, y lo es !! :), resulta que quiero forzar un pantallazo azul, pero, ¿porqué?.

Como bien sabéis Windows es perfecto (cási perfecto) y solamente se puede desencadenar un BSOD cuando se produce una operación no valida dentro de la memoria del Kernel. Esto no ocurre todas las veces que uno quisiera.

Y claro imaginad por un momento que queréis hacer un dump completo porque tenéis un memory leak en una aplicación nativa que usa memoria virtual, y queréis explorar el árbol de VAD (Virtual Address Descriptors), que son los identificadores del Kernel de Windows para ver en que se está gastando la memoria, pero claro a esto solo tenemos acceso desde una depuración en modo kernel, !vad solo funciona si WinDBG está en modo kernel.

Pues nos os preocupéis que el driver de vuestro teclado os salvará la vida, tenéis que ir a esta entrada de la base de conocimiento de Microsoft y os explican como activarlo.

http://support.microsoft.com/kb/244139

Y funciona!!

Saludos. Luis.

[Evento] Depuraci&oacute;n y Optimizaci&oacute;n Avanzada de Aplicaciones (recursos)

Hola a todos!!. Primero dar gracias a todos por haber venido a verme a la charla, y gracias también por los mails de agradecimiento!!.

La presentación de power point de la charla.

evento-depuracion

El sitio web de ejemplo aquí.

TinyGet (Herramienta para hacer las peticiones a la web) está disponible como IIS 6 Resource ToolKit http://support.microsoft.com/kb/840671

Libros:

CLR Via C#

clip_image001

Este libro es uno de los mejores. Explica el funcionamiento del CLR (Common Language Runtime) expuesto desde C#.

http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632%3FSubscriptionId%3D15HRV3AZSMPK0GXTY102%26tag%3Die8suggestion-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0735621632

Professional .NET Framework 2.0

clip_image002

http://www.amazon.com/Professional-NET-Framework-2-0-Programmer/dp/0764571354%3FSubscriptionId%3D15HRV3AZSMPK0GXTY102%26tag%3Die8suggestion-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0764571354

 

Windows Internals

Windows® Internals: Including Windows Server 2008 and Windows Vista, Fifth Edition (PRO-Developer)

Windows Internals es el mejor libro de referencia de Windows, esta 5º edición incluye Windows Vista y Server 2008. Es un libro fundamental para conocer la plataforma Windows.

http://www.amazon.com/Windows%C2%AE-Internals-Including-Windows-PRO-Developer/dp/0735625301%3FSubscriptionId%3D15HRV3AZSMPK0GXTY102%26tag%3Die8suggestion-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0735625301

Blogs:

http://blogs.technet.com/markrussinovich/ (Mark Russinovich) Creador de la suite sysinternals

http://www.wintellect.com/cs/blogs/jrobbins/

http://blogs.msdn.com/tess/

Herramientas:

En este blog en post anteriores podeís encontrar varios post de como se configura el entorno de depuración con símbolos y demás. Además de eso varias herramientas útiles.

Process explorer, sin duda la herramienta definitiva para extraer información de que está haciendo Windows. Nos muestra información sobre rendimiento, consumo de memoria, threads, manejadores y demás.

Process Monitor, igual que process explorer solo que es un registro de la actividad de Windows, en tres categorías Threads, Registro y IO

Notas:

Muchos de vosotros me habeís enviado mails preguntándome varias cosas respondo a todo el mundo desde aquí porque son preguntas interesantes.

Q: Yo vivia muy feliz antes de este evento, ahora siento miedo ¿Porqué?

A: Bueno, las razones son varias, pero creo que al exponer lo complicado que puede ser el desarrollo de aplicaciones uno siente miedo ante esto. Teniendo en cuenta que durante el evento se ha hablado de .net que es un lenguaje de alto nivel, en el que hay muchas cosas que ayudan a programar y hacer las cosas más fáciles, resulta más chocante aún. El caso es que la informática es una de las disciplinas más complicadas que existen por ahí afuera. Y si no me creeis leeros este ensayo de Edsget W. Dijkstra desde aquí.

Q: Todos los ejemplos han sido de una aplicación ASP.NET atacando directamente al proceso w3wp.exe, ¿Es posible hacer esto con otro tipo de aplicaciones?

A: Desde luego las demos estaban preparadas así pero se pueden generar dumps de aplicaciones de escritorio ya sea Windows Forms, WPF o lo que sea. De hecho este tipo de depuración es especial porque está pensada para cuando no se está delante de la maquina que tiene el problema.

[Evento] Depuraci&oacute;n y Optimizaci&oacute;n Avanzada de Aplicaciones

Hola a todos, el próximo jueves 2 de octubre participo en la charla “Depuración y Optimización Avanzada de Aplicaciones” que se celebrará en el CIIN (Centro de innovación de Microsoft de Cantabria) por parte de Plain Concepts, y con mi compañero Pablo Doval.

Por cierto el evento se retransmitirá online a través de la web de Microsoft (el enlace a final del post).

evento-depuracion

Cuando desarrollamos Software, pasamos por una serie de etapas, desde el diseño hasta el despliegue final, en las que buscamos proporcionar soluciones que resuelvan de forma excelente los problemas y requerimientos planteados. Sin embargo, el camino no es fácil y muchas veces nos olvidamos de aspectos muy importantes como son la depuración, la optimización y el testeo de nuestras aplicaciones como camino a lograr aplicaciones con el mayor nivel de calidad posible. Para cubrir esta etapa imprescindible en todo desarrollo de software, os presentamos en colaboración con Plain Concepts una nueva jornada de la que se puede hablar durante días y días: Depuración y Optimización Avanzada de Aplicaciones.

La jornada que os proponemos será gratuita por cortesía de Plain Concepts y constará de un repaso de la depuración básica con Visual Studio, profiling de problemas de rendimiento y depuración avanzada con WinDbg. Se tocarán temas como análisis de rendimiento y pruebas de carga, localización de puntos calientes y cuellos de botella, resolución de problemas esquivos (cuelgues, pérdidas, bloqueos, CTDs…) tanto en vivo como de modo postmortem mediante el análisis de volcados de memoria y otras técnicas de depuración. También se abordarán, durante el transcurso de la sesión, aspectos de soportabilidad como la construcción de un servidor de símbolos sincronizados, la generación de volcados de memoria en nuestras aplicaciones, etc. Como viene siendo habitual, la parte teórica irá acompañada de demostraciones prácticas sobre escenarios habituales de optimización y resolución de problemas.

La jornada será impartida por Pablo Alvarez Doval. Pablo ha estado vinculado a las tecnologías Microsoft desde el inicio de su carrera profesional, y fue miembro del GTSC de Microsoft en el equipo de SQL Server. Actualmente trabaja para Plain Concepts, donde lidera la iniciativa DOT (Debugging & Optimization Team), destinada a ayudar a sus clientes en la resolución de problemas de rendimiento o problemas de difícil trazabilidad. Dispone de un blog en http://geeks.ms/blogs/palvarez, donde aborda principalmente temas de rendimiento, WinDbg y SQL Server.

http://www.ciin.es/web/servicios/eventos/Paginas/DepOptApp021008.aspx?Fecha=02-10-2008 

http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032390753&EventCategory=4&culture=es-ES&CountryCode=ES 

http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032390757&EventCategory=4&culture=es-ES&CountryCode=ES

Disponible .NET Framework 3.5 SP1 Sources

A través del blog del Reference Source Code Center Team Blog, http://blogs.msdn.com/rscc/archive/2008/08/28/net-framework-3-5-sp1-sources-are-available.aspx, disponible el código fuente del .NET Framework 3.5 SP1. Si trabajáis con el código fuente del framework mientras depuráis las aplicaciones, esta release es justo lo que estabais buscando. Además en el SP1 de Visual Studio 2008 trae directamente el soporte para el código fuente del framework.

Resuelto &ndash; Usar un origen http en un BitmapImage ralentiza tu aplicaci&oacute;n WPF

Como sabréis hace poco escribí un post sobre un problema que encontré dentro de WPF relacionado con el rendimiento de una aplicación que estaba desarrollando. El caso es que además de escribir un post inicie también un comentario dentro de la web de connect de Microsoft en https://connect.microsoft.com/VisualStudio/ para que Microsoft supiera que está pasando, pues bien hoy me han respondido al comentario y resulta que efectivamente es un bug y que lo van a solucionar.

Aquí tenéis el enlace del post original

http://www.luisguerrero.net/post/2008/05/Usar-un-origen-http-en-un-BitmapImage-ralentiza-tu-aplicacioacute3bn-WPF.aspx

y en enlace de connect

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=344785 (requiere inicio de sesión)

Lo interesante de este bug que como una herramienta como WINDBG y SOS nos puede ayudar a solucionar un problema en nuestro software.

Saludos a todos.

Experiencia de uso de .Net Framework 3.5 SP1

Como ya comente en otro post, ya ha salido el .net Framework 3.5 SP1 y el Visual Studio 2008 SP1, pues bien quiero comentar mi experiencia de uso desde que lo instale en mi portátil. Tengo que aclarar que mi portátil es tanto de uso profesional como de uso personal, así que es importante para mí que este service pack no rompa las aplicaciones que estoy desarrollando.

Voy a comentar desde varios punto de vista que características incluye este service pack que no se han comentado en los post oficiales de Microsoft y cosas que yo considero importantes.

Depuración

Dentro de la sección de depuración hay varias cosas interesantes a mencionar pero solo una negativa a comentar.

La única pega que tiene que el SP1 es que al cambiar las versiones de los ensamblados del framework la depuración con el código fuente del framework no está disponible porque no podemos bajarnos los símbolos de depuración con la información del código fuente de Microsoft. Por ejemplo, mscorlib.dll tiene de versión 2.0.50727.3031 (netfxsp.050727-3000).

Por lo demás vamos a comentar cosas positivas en el área de depuración que incluye el SP1 de Visual Studio 2008.

Dentro del menú de herramientas -> Opciones -> Depuración tenemos una opción interesante.

  • Enable .Net Framework source stepping, que nos permite depurar el código fuente del framework simplemente marcando esta opción.

image

Dentro de lo que es la depuración normal de una aplicación nos podemos encontrar con llamadas complejas que a su vez llaman a otras funciones que devuelven parámetros para pasarlo a la función principal, pues bien ahora podemos seleccionar en qué función queremos saltar, por ejemplo tenemos este trozo de código.

   1: Parse(RequestManager.Current.MakeRequestOfertas());

En el que se realizan tres llamadas a funciones, Parse, al singleton de RequestManager y al método MakeRequesOfertas, pues bien imaginemos que queremos depurar pero solo nos interesa la función MakeRequestOfertas, normalmente pulsado F11 y entrado dentro de las funciones pasaríamos por el singleton del RequestManager.Current todas las veces, lo que puede hacerse un poco molesto, pues ahora en el menú contextual podemos especificar a qué función saltar.

image

Siguiendo con esta característica del depurador de Visual Studio, una de las cosas más molestas cuando se depura código es entrar dentro de las propiedades cuando se está depurando código lo que nos hace perder un tiempo en recorrer todas las instrucciones que hay dentro de la propiedad. Dentro del framework hay un atributo que nos permite decirle al depurador que no salte dentro del código de una función para no perder tiempo en depurarla, este atributo System.Diagnostics.DebuggerStepThroughAttribute únicamente se puede usar para clases, estructuras, constructores y métodos. Pues bien ahora con el SP1 del Visual Studio 2008, en el menú contextual en modo depuración tenemos una opción que nos permite que habilitar la característica de saltar sobre las propiedades y sobrecarga de operadores (Step over properties and operators).

Otra característica más del depurador es que ahora podemos hacer depuración remota con Windows Vista, cosa que antes no era posible. Además de esto se han corregido problemas con la depuración de aplicaciones multihilo.

La depuración de consultas LINQ también se ha mejorado, permitiendo ver los resultados de una consulta LINQ directamente con el depurador, pero no se soporta la edición en tiempo de ejecución durante la depuración

image

Como últimas características, se ha mejorado la depuración de aplicaciones de WCF y de scripts, como por ejemplo JavaScript

Runtime WPF

Otra de las características que nos prometían con este service pack es un mejor rendimiento de las aplicaciones de WPF, y lo han conseguido.

Si miramos a la arquitectura actual de WPF, hay un componente no administrador dentro del arquitectura milcore.dll que es la api responsable de convertir las llamadas de dibujado de geometría de WPF a código que llama a DirectX, esto permite que nuestras aplicaciones en WPF estén aceleradas por hardware de una manera transparente, es también esta milcore.dll uno de los principales componentes que utiliza el Desktop Windows Manager para componer la interfaz de usuario de Windows Vista y permitirnos que podamos hacer las pre visualizaciones de las aplicaciones y el Switch3D.

 

image

image

Pues bien ahora en una aplicación WPF del .net Framework 3.5 SP1, milcore.dll ha desaparecido de los módulos cargados y no está en la pila de ejecución de tu proceso actual. ¿Qué es lo que hay ahora?, pues si nos fijamos en los Threads que hay en una aplicación cualquiera de WPF vemos que hay una nueva dll llamada wpfgfx.dll, que es la que se encarga de dibujar los gráficos en WPF. Esto es un cambio de concepto interesante porque ahora el modelo de dibujado de una aplicación WPF es multihilo. Esto que significa, pues que el hilo principal de tu aplicación, cuando solicite el dibujado de un control o una animación enviará un mensaje a este thread que será el responsable de dibujar esa petición, lo que hace que se mejore sensiblemente el tiempo de respuesta de una aplicación WPF y además su rendimiento.

image

Cosas a decir de wpfdfx.dll, pues es una dll no administrada, osea completamente nativa y si nos fijamos en las importaciones que hace esta dll no encontramos ninguna referencia a d3d9.dll (DirectX), pero si encontramos referencias a GDI32.dll, Knerl32.dll, Winmm.dll (Windows Multimedia) y WindowsCodects.dll (Infraestructura de codecs de imagen de WPF). Pero si somos un poco curiosos y desemsamblamos al dll con IDA vemos que no hace referencia directamente al d3d9.dll pero si lo carga con LoadLibrary y después emplaza los métodos con GetProcAddress.

 

Espero que os guste !!