Pergunta

Como alguém que está apenas começando a aprender os meandros da depuração de computador, não consigo entender como ler o Stack Text de um dump no Windbg.Não tenho ideia de por onde começar, como interpretá-los ou como fazer isso.Alguém pode oferecer orientação a esta pobre alma?

ou seja (o único lixo que tenho em mãos, na verdade)

>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

Eu sei que o problema está relacionado ao driver de vídeo da Nvidia, mas o que eu quero saber é como realmente ler a pilha (por exemplo, o que é b69dd8f4?) :-[

Foi útil?

Solução

Primeiro, você precisa configurar os símbolos adequados.Os símbolos permitirão que você combine endereços de memória com nomes de funções.Para fazer isso você deve criar uma pasta local em sua máquina na qual armazenará um cache local de símbolos (por exemplo:C:\símbolos).Então você precisa especificar o caminho do servidor de símbolos.Para fazer isso basta acessar:Arquivo> Caminho e tipo do arquivo de símbolo:

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

Você pode encontrar mais informações sobre como configurar corretamente os símbolos aqui.

Depois de configurar corretamente o servidor Symbols, você pode abrir o minidespejo em:Arquivo> Abrir Crash Dump.

Assim que o minidespejo for aberto, ele mostrará no lado esquerdo da linha de comando o thread que estava em execução quando o despejo foi gerado.Se você quiser ver o que este thread estava executando, digite:

kpn 200

Isso pode levar algum tempo na primeira execução, pois é necessário baixar os símbolos públicos necessários relacionados à Microsoft na primeira vez.Depois que todos os símbolos forem baixados, você obterá algo como:

01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)

Onde:

  • O PRIMEIRO NÚMERO:Indica o número do quadro
  • MÓDULO:A DLL que contém o código
  • AULA:(Somente em código C++) mostrará a classe que contém o código
  • NOME DA FUNÇÃO:O método que foi chamado.Se você tiver os símbolos corretos, também verá os parâmetros.

Você também pode ver algo como

01 MODULE!+989823

Isso indica que você não possui o símbolo adequado para esta DLL e, portanto, só poderá ver o deslocamento do método.

Então, o que é uma pilha de chamadas?

Imagine que você tem este código:

void main()
{
  method1();
}

void method1()
{
  method2();
}

int method2()
{
  return 20/0;
}

Neste código, o método2 basicamente lançará uma exceção, pois estamos tentando dividir por 0 e isso fará com que o processo trave.Se obtivermos um minidespejo quando isso ocorresse, veríamos a seguinte pilha de chamadas:

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

Você pode seguir a partir desta pilha de chamadas que "main" chamou "method1" que então chamou "method2" e falhou.

No seu caso, você tem essa pilha de chamadas (que eu acho que é o resultado da execução do 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

A primeira coluna indica o Child Frame Pointer, a segunda coluna indica o endereço de retorno do método que está sendo executado, as próximas três colunas mostram os 3 primeiros parâmetros que foram passados ​​para o método e a última parte é o nome da DLL (nv4_disp) e o deslocamento do método que está sendo executado (+0x48b94).Como você não possui os símbolos, não poderá ver o nome do método.Duvido que a NVIDIA ofereça acesso público aos seus símbolos, então acho que você não poderá obter muitas informações daqui.

Eu recomendo que você execute "kpn 200".Isso mostrará a pilha de chamadas completa e você poderá ver a origem do método que causou essa falha (se fosse uma DLL da Microsoft, você deveria ter os símbolos apropriados nas etapas que forneci).

Pelo menos você sabe que está relacionado a um bug da NVIDIA ;-) Tente atualizar as DLLs deste driver para a versão mais recente.

Caso você queira saber mais sobre depuração do WinDBG recomendo os seguintes links:

Outras dicas

Um tutorial muito bom sobre como interpretar um rastreamento de pilha está disponível aqui:

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

No entanto, mesmo com um tutorial como esse pode ser muito difícil (ou quase impossível) interpretar um dump de pilha sem os símbolos adequados disponíveis/carregados.

Pode ser útil incluir um exemplo da pilha que você está tentando ler.Uma boa dica é garantir que você tenha símbolos de depuração corretos para todos os módulos mostrados na pilha.Isso inclui símbolos para módulos no sistema operacional. A Microsoft disponibilizou publicamente seu servidor de símbolos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top