[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:
Se você achar alguma falha no código, me avise.
Divirta-se usando essa nova versão para criar seus próprios scripts!