Pregunta

Como alguien que recién está comenzando a aprender 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, cómo interpretarlos o cómo hacerlo.¿Alguien puede ofrecer orientación a esta pobre alma?

es decir (el único basurero que tengo a mano 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 Nvidia, pero lo que quiero saber es cómo leer realmente la pila (por ejemplo, ¿qué es b69dd8f4?):-[

¿Fue útil?

Solución

Primero, debe tener configurados los símbolos adecuados.Los símbolos le permitirán hacer coincidir las direcciones de memoria con los nombres de funciones.Para hacer esto, debe crear una carpeta local en su máquina en la que almacenará un caché local de símbolos (por ejemplo:C:\símbolos).Luego debe especificar la ruta del servidor de símbolos.Para hacer esto simplemente vaya a:Archivo > Ruta del archivo de símbolos y escriba:

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

Puedes encontrar más información sobre cómo configurar correctamente los símbolos. aquí.

Una vez que haya configurado correctamente el servidor de Símbolos, puede abrir el minivolcado desde:Archivo > Abrir volcado de memoria.

Una vez abierto el minivolcado, le mostrará en el lado izquierdo de la línea de comando el hilo que se estaba ejecutando cuando se generó el volcado.Si desea ver qué estaba ejecutando este hilo, escriba:

kpn 200

Esto puede llevar algún tiempo la primera vez que lo ejecute, ya que la primera vez debe descargar los símbolos públicos necesarios relacionados con Microsoft.Una vez que se hayan descargado todos los símbolos, obtendrás 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 fotograma.
  • MÓDULO:La DLL que contiene el código.
  • CLASE:(Solo en código C++) le mostrará la clase que contiene el código
  • NOMBRE DE FUNCIÓN:El método que fue llamado.Si tiene los símbolos correctos, también verá los parámetros.

También podrías ver algo como

01 MODULE!+989823

Esto indica que no tiene el símbolo adecuado para esta DLL y, por lo tanto, solo puede ver el desplazamiento del método.

Entonces, ¿qué es una pila de llamadas?

Imagina que tienes este código:

void main()
{
  method1();
}

void method1()
{
  method2();
}

int method2()
{
  return 20/0;
}

En este código, el método 2 básicamente generará una excepción ya que estamos intentando dividir entre 0 y esto provocará que el proceso falle.Si obtuviéramos un minivolcado cuando esto ocurriera, veríamos la siguiente pila de llamadas:

01 MYDLL!method2()
02 MYDLL!method1()
03 MYDLL!main()

Puede seguir desde esta pila de llamadas que "principal" llamó "método1" y luego llamó "método2" y falló.

En su caso, 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 del marco secundario, 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 la DLL (nv4_disp). y el offset 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 trataba de una DLL de Microsoft, debería tener los símbolos adecuados en los pasos que le proporcioné).

Al menos sabes que está relacionado con un error de NVIDIA ;-) Intente actualizar las DLL de este controlador a la última versión.

En caso de que quieras aprender más sobre la depuración de WinDBG te recomiendo los siguientes enlaces:

Otros consejos

Un tutorial realmente bueno sobre cómo interpretar un seguimiento de pila está disponible aquí:

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

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

Puede resultar útil incluir un ejemplo de la pila que está intentando leer.Un buen consejo es asegurarse de tener los 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 puesto a disposición del público su servidor de símbolos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top