2008-09-16 15 views
8

Como alguien que recién está empezando a conocer las complejidades de la depuración de computadoras, por mi vida, no puedo entender cómo leer el texto de pila de un volcado en Windbg. No tengo idea de por dónde empezar para saber cómo interpretarlos o cómo hacerlo. ¿Alguien puede ofrecerle dirección a esta pobre alma?Pilas de interpretación en Minivolcados de Windows

es decir, (el único vertedero que tengo en la mano conmigo en realidad)

>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

Sé que el problema tiene que ver con el controlador de pantalla de Nvidia, pero lo que quiero saber es cómo leer realmente la pila (por ej., ¿qué es b69dd8f4?): - [

Respuesta

18

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:

+1

Esta respuesta es impresionante. ASÍ QUE deberías tener más respuestas como esta. –

+0

¡Gracias, hombre! ¡Ayudándome mucho! – qweet

0

Puede ser útil incluir un ejemplo de la pila que está tratando de leer. Un buen consejo es asegurarse de tener símbolos de depuración correctos para todos los módulos que se muestran en la pila. Esto incluye símbolos para módulos en el sistema operativo, Microsoft ha hecho que su servidor de símbolos esté disponible públicamente.

3

Un muy buen tutorial sobre la interpretación de un seguimiento de la pila está disponible aquí:

http://www.codeproject.com/KB/debug/cdbntsd2.aspx

Sin embargo, incluso con un tutorial como que puede ser muy difícil (o casi imposible) para interpretar un volcado de pila sin los símbolos adecuados disponibles/cargados.

Cuestiones relacionadas