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!