2011-01-15 10 views
45

Estoy usando Visual Studio 2010 Professional Edition y Windows Vista.Depuración de archivos de volcado en Visual Studio

En primer lugar, tengo este código. Como puede ver, ¡bloqueará el programa!

using System; 

namespace Crash 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string a = null; 

      if (a.Length == 12) 
      { 
       // ^^ Crash 
      } 
     } 
    } 
} 

El programa se bloqueará en la instrucción if. Ahora, quiero descubrir que se bloqueó en esa declaración if.

Si "Comience sin depurar" desde Visual Studio, Crash.exe falla. Utiliza 1,356kb de memoria. Obtengo la opción Vista de Cerrar Programa/Depurar. Si elijo Debug, puedo abrir una nueva instancia de Visual Studio y me señala una NullReferenceException en la sentencia if. Esto es bueno.

Ahora déjenme asumir que se cuelga en otra computadora, y les pido que me den un archivo de volcado a través del Administrador de tareas. Es 54,567kb. ¡Por qué tan grande! ¡Es vasto! De todos modos, estoy menos interesado en que (un poco)

Si abro que volcado con WinDbg, me sale muy poco de utilidad para el ojo no entrenado:

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86 
Copyright (c) Microsoft Corporation. All rights reserved. 


Loading Dump File [C:\Users\Richard\Desktop\Crash.DMP] 
User Mini Dump File with Full Memory: Only application data is available 

Symbol search path is: SRV*C:\SYMBOLS*http://msdl.microsoft.com/download/symbols 
Executable search path is: 
Windows Server 2008/Windows Vista Version 6002 (Service Pack 2) MP (4 procs) Free x86 compatible 
Product: WinNt, suite: SingleUserTS Personal 
Machine Name: 
Debug session time: Sat Jan 15 11:07:36.000 2011 (UTC + 0:00) 
System Uptime: 0 days 4:24:57.783 
Process Uptime: 0 days 0:00:05.000 
........................ 
eax=002afd40 ebx=77afa6b4 ecx=002afd48 edx=00000001 esi=001cdaa4 edi=00000000 
eip=77bf5e74 esp=001cda5c ebp=001cdacc iopl=0   nv up ei ng nz ac pe cy 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000297 
ntdll!KiFastSystemCallRet: 
77bf5e74 c3    ret 

Sin embargo, esto es de menor interés para mí . Por lo que puedo decir, necesito escribir comandos para obtener resultados útiles, y Visual Studio es mejor.

Así que lo abro con Visual Studio. Puedo elegir "Depurar solo con nativos", pero obtengo muchas cosas que significan algo para personas inteligentes como tú, ¡y no soy inteligente! Tengo estas dos pantallas:

enter image description here

enter image description here

Por lo tanto, mi pregunta:

¿Cómo demuestro Visual Studio para mi código fuente?

Además, ¿hay alguna manera de obtener un archivo de volcado más pequeño? Parece ridículamente grande, incluso después de la compresión. No entiendo por qué no podría haber uno que sea solo un poquito más grande que la huella del programa, y ​​aún así tener una buena depuración, con el código fuente.

+0

¿Está familiarizado con el depurador integrado en Visual Studio? En realidad, no leí hasta el final de su pregunta, pero no está claro por qué esto no funciona para usted. –

+1

Honestamente, no estoy familiarizado con eso, por lo que vine aquí. Debe haber un botón de "Cargar fuente" en algún lugar, pero podría encontrarlo ... – niemiro

Respuesta

41

La función anunciada de que Visual Studio 2010 le permite depurar archivos de volcado y pasar por el código fuente administrado viene con un gotcha: funciona only for .NET 4.0 assemblies. Estos son los pasos:

  1. Crear un archivo de volcado en otra computadora usando el Administrador de tareas
  2. Abrir la solución en VS2010
  3. Abrir el archivo .dmp (Archivo-> Abrir ...)
  4. Haga clic en Debug With Mixed (Esto será visible solo para .NET 4.0) Código
  5. Fuente se abrirá y usted será capaz de inspeccionar la causa exacta y la ubicación de la excepción

En cuanto a la depuración nativa con sólo es cuestión de Visual Studio es más útil que WinDbg.

+0

¿Esto también funcionaría si se inyectara un dll a una aplicación nativa cuando se generara el volcado y deseara encontrar por qué el dll se colgó? Por supuesto, el dll es .net4 +. – Guapo

+1

también estoy enfrentando el mismo problema, pero no puedo ver el código fuente en Visual Studio. Estoy usando, Net 4.5 y VS15. ¿Puede por favor guiarme con alguna configuración para obtener el código fuente con el archivo de volcado en VS –

5

Debería estar suministrando el archivo relacionado pdb (base de datos del programa) al depurador para que pueda cargar los símbolos. También para obtener una mejor vista, use el servidor de símbolo público de Microsoft. This article contiene información sobre él.

38

Las herramientas que está utilizando aquí nunca fueron diseñadas para solucionar problemas de bloqueo de programas administrados. Minidumps y Windbg es lo que utilizas para descubrir qué está mal con el código escrito en C o C++. Herramientas bastante importantes, estos son lenguajes cuyos tiempos de ejecución no tienen soporte para el tipo de regalos que puede obtener de un programa administrado bloqueado. Como una excepción con un seguimiento de pila.

La razón por la que los tamaños de minivolcado son tan diferentes es por el mini en minivolcado. Por diseño, estaba destinado a capturar una pequeña instantánea del proceso. El argumento relevante es DumpType en el MiniDumpWriteDump function. Hay un código realmente inteligente en esta función que puede determinar qué partes del estado del proceso no necesitan ser registradas porque no es probable que lo use en la sesión del depurador. Que puede anular proporcionando indicadores de tipo de vuelco adicionales. El minivolcado que genera Explorer tiene todas esas banderas activadas, obtienes todo el kit y el caboodle.

Que en realidad es bastante importante para un programa administrado. La heurística utilizada por este creador de minivolcados es solo apropiada para código no administrado. La depuración de un volcado de programa administrado solo funciona bien cuando se incluye todo el montón recogido de basura en el volcado. Sí, será un vertedero grande, el mini ya no se aplica.

Su próximo problema es que obtendrá el alma de la vista de máquina desde los datos del minivolcado. Sus capturas de pantalla muestran el código de la máquina. Si se encuentra dentro de Windows en esos disparos, observe cómo ntdll.dll se encuentra en la parte superior de la pila. Las entradas mscorwks.dll son el CLR. Más abajo, fuera de la vista, deberías ver los cuadros de pila de tu propio código. Sin embargo, verá el código máquina generado por el compilador JIT. No es tu código C#.

Hay un complemento de Windbg llamado sos.dll que amplía el conjunto de comandos de Windbg para poder inspeccionar los datos administrados. Simplemente google "sos.dll" para obtener buenos éxitos. Sin embargo, esto todavía es looong lejos del tipo de experiencia de depuración que obtendrá del depurador de Visual Studio. Que es íntimamente consciente del código administrado, muy diferente de Windbg o el depurador VS que puede cargar minivolcados. Sos fue diseñado para solucionar problemas de CLR.

No hubo mejoras dramáticas en VS2010 aparte de la página de información de minivolcado que ahora se ve. Lo que realmente no hace mucho en absoluto. Sospecho que el equipo de depuradores tiene esto en su lista de tareas pendientes, sin duda hay algunos problemas fundamentales que superar. Particularmente en el formato de minivolcado y código de creación. Use connect.microsoft.com para proporcionar comentarios, le prestan atención y permiten que los votos afecten a su lista de prioridades.

+0

muchas gracias! Me has enseñado mucho. De verdad, realmente aprecio lo que has hecho por mí. Muchas gracias por tomarse el tiempo para ayudarme. Sigo cambiando la "Marca como respuesta"! Tantas respuestas fantásticas (bueno, ¡eso es TAN para ti!) ¡Muchas gracias de nuevo! – niemiro

+3

@Todo el mundo: ¡Por favor, denme muchos votos a favor para compensar que solo puedo marcar una publicación como respuesta! – niemiro

Cuestiones relacionadas