[PowerShell Script] PowerDbg v2.0 – Usando PowerShell para Controlar o WinDbg


Por Roberto Alexis Farah


 


Já faz um tempo desde meu último post. Estive ocupado com outras tarefas, incluindo a nova versão 2.0 da biblioteca PowerDbg.


Há bastante coisa nova nessa versão e estimo que aproximadamente 80% dos mais usados comandos do WinDbg foram mapeados.


Eis os mais recentes cmdlets:


 


Parse-PowerDbgVERTARGET


 


Extrai informações do comando vertarget, obtendo tempo de User mode e tempo de Kernel mode.


 


Parse-PowerDbgRUNAWAY


 


Extrai informação de !runaway 1 ou !runaway 2.


 


Convert-PowerDbgRUNAWAYtoArray


 


Converte a saída dos comandos !runaway 1 ou !runaway 2 para um array de duas dimensões com os elementos na mesma ordem da saída do comando. Isso significa que item[0,0] mostra a thread consumindo mais tempo de CPU e item[0,1] mostra o tempo de CPU.


 


Parse-PowerDbgK


 


Extrai a saída do comando k includindo as variações do mesmo comando. A exceção é o comando kPn porque kPn quebra os argumentos em diferentes linhas.


O hash table desse cmdlet contém o número da thread e a pilha complete para cada thread.


 


Parse-PowerDbgSymbolsFromK


 


Extrai a saída do comando k e variantes. A exceçao é kPn porque kPn quebra o argumento em diferentes linhas.


O hash table para esse parser contém o número da thread e todos os símbolos da pilha para  cada thread.


 


Parse-PowerDbgLM1M


 


Extrai a saída do comando lm1m. É útil obter informações de módulos que são parte do processo.


 


Classify-PowerDbgThreads


 


Esse cmdlet analyze todas as threads e retorna um array onde cada item corresponde a uma constante. A constante indica o que cada thread está fazendo de acordo com:


 


$global:g_unknownSymbol             = 0


$global:g_waitingForCriticalSection  = 1


$global:g_doingIO                          = 2


$global:g_threadWaiting                 = 3


$global:g_GCthread                        = 4


$global:g_waitUntilGCComplete       = 5


$global:g_suspendForGC                 = 6


$global:g_waitForFinalize                 = 7


$global:g_tryingGetLock                  = 8


$global:g_winSockReceivingData      = 9


. . .


. . .


. . .


 


Ótimas notícias aqui! É muito fácil se adicionar mais símbolos e aumentar a granularidade da análise desse cmdlet.


Ele funciona tanto para código native como para código gerenciado.


 


Analyze-PowerDbgThreads


 


Esse talvez seja o cmdlet que você mais vai usar. Esse cmdlet usa alguns dos cmdlets acima para analisar o que cada thread está fazendo, então ele mostra o resultado ordenado por User time.


 


Esse cmdlet é muito útil para hangs, crashes e cenários de alta CPU! Em qualquer momento, durante a depuração, você pode rodar esse comando e entender o que cada thread está fazendo e o tempo de CPU para User e Kernel.


Ele funciona tanto com código nativo, quanto com código gerenciado.


 


Com todos os cmdlets que a biblioteca PowerDbg tem até o momento, sera fácil para mim e para você construer o próximo script. J


 


Olhe, por exemplo, como Analyze-PowerDbgThreads trabalha e pegue o código fonte da PowerDbg v2.0:


 


Debugging Toolbox


 


Se você achar alguma falha no código, me avise.


Divirta-se usando essa nova versão para criar seus próprios scripts!

Comments (0)