En primer lugar, debe tener los símbolos adecuados configurados. Los símbolos le permitirán hacer coincidir las direcciones de memoria con los nombres de las funciones. Para hacer esto, debes crear una carpeta local en tu máquina en la que almacenarás un caché local de símbolos (por ejemplo: C: \ symbols). Luego debe especificar la ruta del servidor de símbolos. Para ello sólo tiene que ir a: Archivo> ruta de símbolo y tipo de archivo:
SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
usted puede encontrar más información sobre cómo configurar correctamente los símbolos here.
Una vez que haya configurado correctamente el servidor de símbolos, puede abrir el minivolcado desde: Archivo> Abrir volcado de bloqueo.
Una vez que se abre el minivolcado, le mostrará en el lado izquierdo de la línea de comandos el hilo que se estaba ejecutando cuando se generó el volcado. Si quieres ver lo que este hilo se ejecuta Tipo:
kpn 200
Esto puede llevar algún tiempo que la primera ejecutarlo ya que tiene que descargar los símbolos públicos necesarios relacionados Microsoft primera vez.Una vez que se descargan todos los símbolos que obtendrá algo como:
01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)
Dónde:
- el primer número: Indica el número de cuadro
- MÓDULO: La DLL que contiene el código
- CLASE: (solo en código C++) le mostrará la clase que contiene el código
- FUNCTIONAME: El método que se llamó. Si tiene los símbolos correctos, también verá los parámetros.
También puede ver algo como
01 MODULE!+989823
Esto indica que usted no tiene el símbolo adecuado para esta DLL y, por tanto, que sólo son capaces de ver el método de desplazamiento.
Entonces, ¿qué es una pila de llamadas?
Imagine que tiene este código:
void main()
{
method1();
}
void method1()
{
method2();
}
int method2()
{
return 20/0;
}
En este código metodo2 básicamente lanzará una excepción, ya que estamos tratando de dividir por 0 y esto hará que el proceso se bloquee. Si tenemos un minivolcado cuando esto ocurrió veríamos la siguiente pila de llamadas:
01 MYDLL!method2()
02 MYDLL!method1()
03 MYDLL!main()
Usted puede seguir de esta pila de llamadas que "principal" llamada "metodo1" que entonces se llamaba "metodo2" y fracasó.
En su caso usted tiene esta pila de llamadas (que supongo que es el resultado de ejecutar el comando "kb")
b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94
b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255
b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0
b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000
La primera columna indica el puntero de marco infantiles, la segunda columna indica la dirección de retorno del método que se está ejecutando, las siguientes tres columnas muestran los primeros 3 parámetros que se pasaron al método, y la última parte es el nombre de DLL (nv4_disp) y el desplazamiento del método que se está ejecutando (+ 0x48b94). Como no tiene los símbolos, no puede ver el nombre del método. Dudo que NVIDIA ofrezca acceso público a sus símbolos, así que supongo que no se puede obtener mucha información desde aquí.
Te recomiendo que ejecutes "kpn 200". Esto le mostrará la pila de llamadas completa y es posible que pueda ver el origen del método que causó este bloqueo (si se tratara de una DLL de Microsoft, debería tener los símbolos adecuados en los pasos que le proporcioné).
Al menos usted sabe que está relacionado con un error de NVIDIA ;-) Intente actualizar los archivos DLL de este controlador a la última versión.
En caso de que quiera aprender más sobre WinDBG depuración recomiendo los siguientes enlaces:
Esta respuesta es impresionante. ASÍ QUE deberías tener más respuestas como esta. –
¡Gracias, hombre! ¡Ayudándome mucho! – qweet