[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!