2010-10-18 12 views
7

Estoy tratando de determinar por qué se cuelga un proceso y estoy aprendiendo sobre varias herramientas como Process Explorer, Process Monitor y WinDbg.¿Cómo puedo aprender WinDbg? (re: proceso colgado aparentemente simple)

De todos modos, estoy tratando de utilizar WinDbg y después de conectarla a mi proceso, el depurador dice esto:

(1e9c.1128): Break instruction exception - code 80000003 (first chance) 
eax=7ffda000 ebx=00000000 ecx=00000000 edx=77c5c964 esi=00000000 edi=00000000 
eip=77c18b2e esp=0543ff5c ebp=0543ff88 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!DbgBreakPoint: 
77c18b2e cc    int  3 

Si me quedo !analyze -v, se muestra esto:

FAULTING_IP: 
ntdll!DbgBreakPoint+0 
77c18b2e cc    int  3 

I' Soy un desarrollador de software (VB.NET/C#) sin experiencia en este nivel de depuración, por lo que no estoy seguro de lo que estoy haciendo, pero parece que WinDbg se está conectando a mi proceso y se está rompiendo inmediatamente. Luego, cuando hago un análisis, ¿cree que el punto de corte (que acaba de establecer) es el problema con la aplicación?

¿Cómo se supone que debo usar WinDbg para simplemente conectarlo a un proceso y analizarlo?

(Además, ¿hay alguna buena libros/tutorial para empezar con este nivel de depuración y WinDBG?) Blog de

Respuesta

9

WinDbg es un usuario y un depurador de modo kernel, pero por sí solo no entiende realmente el código administrado y, como tal, el comando !analyze es de uso limitado. Si desea depurar aplicaciones administradas utilizando WinDbg, necesita alguna forma de hacer que WinDbg comprenda las estructuras internas del código administrado. Hay una serie de DLL de extensión que lo habilita. El .NET framework se envía con sos.dll y hay descargas como psscor2.dll y sosex.dll.

SOS y PSSCOR2 proporcionan más o menos las mismas características, mientras que SOSEX agrega nuevas características para la depuración administrada. Los archivos de ayuda para cada uno de estos están disponibles al usar WinDbg. P.ej. para obtener ayuda para SOS, puede usar el comando !sos.help.

Debe cargar SOS o PSSCOR2 y posiblemente SOSEX para depurar una aplicación administrada con WinDbg. P.ej.Si desea cargar SOS se utiliza el comando de carga como esto

.loadby sos clr

Esto cargará SOS desde la ubicación del tiempo de ejecución de .NET. Tenga en cuenta que el tiempo de ejecución se llama mscorwks en .NET 2 y coreclr en Silverlight, por lo que si está utilizando cualquiera de estos, debe cambiar el comando .loadby en consecuencia.

WinDbg necesita símbolos para mostrar información adicional. Esto es particularmente importante para el código no administrado. Puede usar el comando .symfix para dejar que WinDbg recupere los símbolos necesarios del servidor de símbolos de Microsoft.

Como su aplicación se cuelga, es muy probable que tenga uno o más subprocesos bloqueados. Puede ver los hilos gestionados utilizando el comando !threads (o simplemente !t). En .NET, los bloqueos simples se implementan internamente usando una estructura llamada SyncBlocks. Puede verlos usando el comando !syncblk. Si ha cargado SOSEX, el comando !dlk puede detectar automáticamente interbloqueos.

Si desea obtener más información, hay un par de libros y algunos blogs para leer.

Libros:

Blogs:

  • Tess' blog es grande. Tiene numerosos tutoriales y laboratorios que puedes usar para practicar.
  • Tom's blog es también muy útil.

Videos:

  • hice una presentación sobre la depuración administrada en el centro de desarrollo de Microsoft en Dinamarca. Los videos están disponibles en el Canal p. Part 1 y part 2.
5

Tess Ferrandez' es un recurso fantástico para el material .NET WinDbg:

If broken it is, fix it you should

Aunque muchos de sus artículos se dirigen a los procesos de trabajo de IIS/ASP.NET choque, bloqueos y filtraciones, la mayoría de las técnicas se pueden aplicar a todo tipo de escenarios.

+0

+1 Tess es un gran recurso para la depuración de nivel de introducción. – Mike

5

Advanced Windows Debugging sería un buen comienzo.

Cuando Windbg se conecta a un proceso, inyecta un hilo que llama a DbgBreakPoint. Eso es lo que estás viendo. Puede usar ~ para ver los subprocesos en ejecución y luego ~ n para cambiar a un subproceso diferente. k le dará un rastro de la pila del hilo actual, lo que le dará una idea del hang.

3

La instrucción int 3 (cc en binario) es uno de los modos en que los depuradores establecen puntos de interrupción en una aplicación. Esta instrucción genera una interrupción que detiene la ejecución del programa y le da al depurador la oportunidad de reaccionar a esta interrupción. Solo tiene que elegir continuar la ejecución hasta que llegue a donde se encuentra el programa.