Por Roberto Alexis Farah

 

Esse script automatiza uma técnica que tenho usado por bastante tempo sempre que preciso descobrir exceções escondidas na pilha de uma thread e se você for como eu, você vai preferir usar uma abordagem automatizada ao invés de usar uma abordagem manual.

Eu não explicarei a técnica porque Mike Stall já fez isso. Está aqui.

 

Com esse script você obterá não somente as threads lidando com exceções, mas qualquer exceções que poderiam ter ocorrido antes.

Existem várias situações nas quais você poderia achar esse script útil, por exemplo:

 

CENÁRIO TÍPICO

 

A aplicação está travada. Você conecta o depurador nela ou obtém um arquivo de dump para depurar. Você vê threads esperando por uma Critical Section. Você vê a thread the tem o lock da Critical Section, e ela está normal e pronta para trabalhar. Nesse ponto você se pergunta o que está ocorrendo, e porque o lock não foi liberado antes.

 

RESOLUÇÃO

 

Para resolver o mistério, você obtém as exceções da thread que possui o lock e descobre uma exceção tratada que ocorreu antes e a pilha no momento em que ela ocorreu. Nesse ponto você tem uma forte hipótese: talvez o método tratando da exceção não liberou o lock. Por exemplo, o bloco finally poderia não ter o código para liberar a Critical Section; por isso a Critical Section vaza, congelando a aplicação.

 

Para ver as imagens da execução desse script e obter seu código fonte, veja aqui:

 

Debugging Toolbox.