asp.net windbg stack-overflow adplus

asp.net - Ayuda para capturar StackOverflowException con WinDbg y ADPlus



stack-overflow (2)

En caso de que esto pueda ayudar a alguien más, a continuación se muestra el archivo de configuración de ADPlus que se me ocurrió. Mirándolo ahora, no estoy seguro de que la fuga tenga algún efecto. Se adjunta cuando se está ejecutando una aplicación ASP.NET que lanza una StackOverflowException, esto generará los archivos .dmp de "primera oportunidad de StackOverflow completo" y "primera oportunidad de cierre del proceso completo" en el OutputDir especificado. Abra el primer archivo con ADPlus y ejecute ".loadby sos mscorwks" seguido de "! Clrstack" para ver qué podría estar causando el desbordamiento de la pila.

<ADPlus> <Settings> <RunMode>CRASH</RunMode> <OutputDir>C:/Dumps</OutputDir> <ProcessName>w3wp.exe</ProcessName> </Settings> <Exceptions> <Option>FullDumpOnFirstChance</Option> <Option>MiniDumpOnSecondChance</Option> <Option>NoDumpOnFirstChance</Option> <Option>NoDumpOnSecondChance</Option> <Config> <Code>AllExceptions</Code> <Actions1>Void</Actions1> <Actions2>Void</Actions2> <ReturnAction1>GN</ReturnAction1> <ReturnAction2>GN</ReturnAction2> </Config> <Config> <!-- av = AccessViolation ch = InvalidHandle ii = IllegalInstruction dz = IntegerDivide c000008e = FloatingDivide iov = IntegerOverflow lsq = InvalidLockSequence sov = StackOverflowException eh = CPlusPlusEH * = UnknownException clr = NET_CLR bpe = CONTRL_C_OR_Debug_Break ld = DLL_Load ud = DLL_UnLoad epr = Process_Shut_Down sbo = Stack_buffer_overflow --> <Code>sov;sbo</Code> <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1> <CustomActions1>!runaway</CustomActions1> <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2> <CustomActions2>!runaway</CustomActions2> <!-- G = go GN = go unhandled exception GH = go handled exception Q = quit QD = quit and detach --> <ReturnAction1>GN</ReturnAction1> <ReturnAction2>GN</ReturnAction2> </Config> <Config> <Code>clr</Code> <Actions1>Void</Actions1> <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2> <ReturnAction1>GN</ReturnAction1> <ReturnAction2>GN</ReturnAction2> </Config> <Config> <Code>epr</Code> <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1> <Actions2>Void</Actions2> <ReturnAction1>GN</ReturnAction1> <ReturnAction2>GN</ReturnAction2> </Config> </Exceptions> </ADPlus>

Version corta

Quiero un script ADPlus que haga un volcado de memoria completo en la StackOverflowException de primera oportunidad, antes de que se limpie algo, e ignore todos los demás tipos de excepción.

Versión de registro

Después de la publicación de un nuevo código ASP.NET, comenzamos a recibir las StackOverflowExceptions intermitentes. Hemos buscado infinitas recursiones y todos los sospechosos habituales en las revisiones agregadas desde la última buena instalación conocida, y no podemos encontrar nada. El sitio web se ejecutará durante una hora y luego se estrellará.

Usamos WinDbg y SOS e intentamos obtener registros de fallas usando ADPlus, usando este comando:

adplus -crash -o D:/Crash -NoDumpOnFirst -iis

El motivo de -NoDumpOnFirst es que solo podemos reproducir este error en la producción en servidores ocupados. Para hacer un minidump en cada excepción de primera oportunidad (bueno, sucede) el depurador debe pausar el proceso de trabajo de IIS el tiempo suficiente para escribir un archivo de 16 megas, por lo que las solicitudes se ponen en cola y la aplicación se vuelve inestable. Debido a que el error puede demorar hasta una hora en volver su cabeza fea, esto es problemático.

Así que con -NoDumpOnFirst, obtengo un archivo de volcado para el cual WinDbg genera estos hilos para:

PDB symbol for mscorwks.dll not loaded ThreadCount: 69 UnstartedThread: 0 BackgroundThread: 69 PendingThread: 0 DeadThread: 0 Hosted Runtime: no PreEmptive GC Alloc Lock ID OSID ThreadOBJ State GC Context Domain Count APT Exception XXXX 1 c6c 000fa758 11808221 Disabled 3b49ee4c:3b49efe8 00120888 1 Ukn (Threadpool Worker) XXXX 2 1294 000fd258 b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Finalizer) XXXX 3 1eb0 0011cdd0 80a220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Completion Port) XXXX 4 1b3c 00120198 1220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 5 1280 00138118 880a220 Enabled 2633de9c:2633ee08 000df4e0 0 Ukn (Threadpool Completion Port) XXXX 6 1db8 00158a48 1180a221 Disabled 4b5a7e2c:4b5a82e8 00120888 1 Ukn (Threadpool Worker) XXXX 9 141c 00162008 180a220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 7 1574 00174008 180a220 Enabled 4d46b6a8:4d46c158 00120888 2 Ukn (Threadpool Worker) XXXX c 16c8 0016b7a8 180a220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 8 1384 00162878 180a220 Enabled 284e26a4:284e45d8 000df4e0 0 Ukn (Threadpool Worker) XXXX b 1c10 0016b3d8 180a220 Enabled 3ed2dae0:3ed2dfe8 00120888 2 Ukn (Threadpool Worker) XXXX a 1814 0016b008 180a220 Disabled 28816384:28816638 00120888 1 Ukn (Threadpool Worker) XXXX d 1fc 1b4d1ff0 220 Enabled 319f89a4:319fa41c 000df4e0 0 Ukn XXXX e 1864 1b4e3d20 180b220 Enabled 4b2c5be0:4b2c6150 000df4e0 0 Ukn (Threadpool Worker) XXXX f 13bc 1b57caf8 200b220 Enabled 4cc71584:4cc73414 00120888 1 Ukn XXXX 10 72c 1f5124a8 180b220 Enabled 3b4b3414:3b4b4fe8 00120888 2 Ukn (Threadpool Worker) XXXX 11 1fd0 1f526398 180b220 Disabled 4d46f41c:4d470158 00120888 1 Ukn (Threadpool Worker) XXXX 12 1f10 1f52f1c8 180b220 Enabled 28812c14:28814638 00120888 2 Ukn (Threadpool Worker) XXXX 13 1b84 1f53a420 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 14 18a4 1f570978 180b220 Enabled 263e18b4:263e2e28 000df4e0 0 Ukn (Threadpool Worker) XXXX 15 1a98 1f57f0a0 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 16 1b4 1f583628 180b220 Enabled 495781ec:4957914c 00120888 2 Ukn (Threadpool Worker) XXXX 17 b90 1f585dc8 180b220 Enabled 265cbe48:265ccba4 000df4e0 0 Ukn (Threadpool Worker) XXXX 18 1590 1f613c60 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 19 1850 1f5fad90 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 1a c78 1f60d3f0 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 1c 1bd8 2121f1b0 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 1d 494 1b4a8c10 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 1e 898 2120f120 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 1f 1820 21355ff8 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 20 15b0 3570e120 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 21 18b0 359ca008 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 22 75c 35a58948 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 25 1a18 213ac8f8 880b220 Disabled 3219a830:3219b450 00120888 1 Ukn (Threadpool Completion Port) System.StackOverflowException (0e3200a4) XXXX 29 1b74 3598e620 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 2a 9b8 3598dbe0 180b220 Enabled 2880ef2c:28810638 000df4e0 0 Ukn (Threadpool Worker) XXXX 2b 1eac 1f6f6288 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 2d 2f4 211759e8 180b220 Disabled 2634eacc:2634ee08 00120888 1 Ukn (Threadpool Worker) XXXX 2e 1e3c 35c2eb60 880b220 Enabled 4b5a5758:4b5a62e8 000df4e0 0 Ukn (Threadpool Completion Port) XXXX 30 394 35c394f8 180b220 Enabled 4cef7930:4cef90d4 000df4e0 0 Ukn (Threadpool Worker) XXXX 31 1e64 35c39128 180b220 Disabled 288110b0:28812638 00120888 1 Ukn (Threadpool Worker) XXXX 32 1af8 35a58578 180b220 Enabled 3b48e7cc:3b48efe8 000df4e0 0 Ukn (Threadpool Worker) XXXX 34 1d44 1f6a6c88 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 35 197c 212088e0 180b220 Enabled 49389ba8:4938af40 000df4e0 0 Ukn (Threadpool Worker) XXXX 36 1e2c 35c1d980 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 38 1ddc 212d03d8 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 39 288 212d0008 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 3a 1694 212bf958 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 3b be4 212ccc40 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 37 ccc 35c4d6d0 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 3c 14ec 35c55af0 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 41 1d94 35c38c08 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 24 130 35746a50 180b220 Enabled 2670ae48:2670cc00 000df4e0 0 Ukn (Threadpool Worker) XXXX 2f 1404 35c1d350 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker) XXXX 43 1ae8 35c25cb8 180b220 Disabled 3b4c28e0:3b4c2fe8 00120888 1 Ukn (Threadpool Worker) XXXX 44 18ac 212cc870 180b220 Disabled 4957e728:4957f14c 00120888 1 Ukn (Threadpool Worker) XXXX 45 18b4 212bf588 180b220 Disabled 3b4c05dc:3b4c0fe8 00120888 1 Ukn (Threadpool Worker) XXXX 46 1c0c 21239858 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 47 4fc 21188b68 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 48 1198 35caa2a8 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 49 1f9c 21147af8 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 4a 1adc 35cc6908 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 4b ce8 35c60e30 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 4d 6f0 35d05aa0 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 4e 1ee8 35c1b6b0 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 42 1d7c 35d9a230 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 3d 7d8 212e1b28 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 23 c0c 503ea010 220 Enabled 00000000:00000000 000df4e0 0 Ukn XXXX 27 1f44 503cdf08 220 Enabled 00000000:00000000 000df4e0 0 Ukn

Intentar imprimir la excepción muestra que no hay seguimiento de pila, y otros métodos se quejan de que es un código no administrado. Mi conjetura es que a medida que se crea el volcado en el proceso de la muerte, todos los subprocesos se han recolectado de basura y no queda información por obtener.

Realmente me gustaría que el depurador realice un volcado completo en la primera oportunidad de la excepción StackOverflowException e ignore todos los demás tipos de excepción. Sé que ADPlus puede usar un archivo de configuración, http://msdn.microsoft.com/en-us/library/cc409304.aspx , pero el formato es totalmente griego para mí. ¿Alguien me puede mostrar cómo hacer un script ADPlus que haga esto?

... por supuesto, si mira la lista de hilos de arriba y sabe exactamente lo que está mal, o podría resolverlo si le diera más información, también podría decirme eso.

Intento de resolución 1

Gracias por la respuesta a continuación, no estaba del todo bien, pero eso me empujó en la dirección correcta. El código de excepción para el desbordamiento de pila era incorrecto (es sbo no sov), (o eso pensé en ese momento, vea las ediciones de deemok a continuación), así que intenté hacer la depuración con la siguiente configuración:

<ADPlus> <!-- Add log entry, log faulting thread stack and dump full on first chance StackOverflow --> <Exceptions> <Config> <!-- This is for the StackOverflow exception --> <Code> sbo </Code> <Actions1> Log;Stack;FullDump </Actions1> <!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) --> <ReturnAction1> GN </ReturnAction1> </Config> </Exceptions> </ADPlus>

Y usando el siguiente comando:

adplus -crash -o D:/Crash -NoDumpOnFirst -c D:/Crash/stackoverflow.cfg -iis

Verifiqué que los archivos de registro de salida indicaban la configuración correcta. El truco es que los parámetros de línea de comando de adplus se ejecutan en orden, por lo que si comienza con una configuración que atrapa las excepciones de primera oportunidad y luego aplica -NoDumpOnFirst, se sobrescribirán los ajustes de configuración. Si aplica la configuración con -c en último lugar, su configuración saldrá ganadora.

Al final, sin embargo, el desbordamiento de la pila demostró ser incatchable. Se produjo el desbordamiento de pila, no se pudo recibir un volcado de memoria, y luego se produjo un volcado en el evento final del proceso de segunda oportunidad, y nuevamente, todo se había recolectado como basura y no pude obtener ninguna información útil.

Intenté provocar un cortocircuito en la excepción de finalización del proceso, en caso de que se activara y se anulara el desbordamiento de la pila, pero luego ocurrió la excepción y no obtuve ningún volcado de memoria.

Afortunadamente, me topé con la respuesta al examinar el código. Era un caso de llamada de método circular, por supuesto.

Resolución actual

El problema se resolvió hace mucho tiempo, pero rápidamente hice una página ASP.NET que causaría un desbordamiento de pila. (No es difícil de hacer después de todo) y probé la respuesta de Axl a continuación.

El XML estaba ligeramente apagado: Axl simplemente olvidó cerrar la etiqueta </ADPlus> (o probaby lo perdió en un copiar y pegar), pero eso fue bastante fácil de arreglar y adplus tuvo la amabilidad de decirme exactamente lo que estaba mal.

Configuré el script contra mi lanzador de desbordamiento de pila de prueba, cargué el resultado en windbg, y cuando llamé! Clrstack obtuve una lista muy clara (y larga) de los métodos que se llamaban circularmente. ¡Esto habría encontrado el problema en un instante! Mantendré esta página marcada para la próxima vez que se produzca un desbordamiento de pila llamando a mi puerta.


<ADPlus> <!-- Add log entry, log faulting thread stack and dump full on first chance --> <Exceptions> <Config> <!-- This is for the stack buffer overflow exception --> <!-- Use sov for exception --> <Code> sbo </Code> <Actions1> Log;Stack;FullDump </Actions1> <!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) --> <ReturnAction1> GN </ReturnAction1> < Config> </Exceptions> </ADPlus>

Guarda eso en .cfg
Entonces puedes ir:

adplus -c .cfg

Edición: tanto sov como sbo son excepciones de desbordamiento de pila. Supongo que uno necesita experimentar con ambos, ya que no me queda muy claro cuál es la diferencia entre los dos. (¿podría sbo denotar una llamada alloca () inválida?)