Investigando processos problemáticos

1

Quando um comando ou processo parece travar, congelar, travar ou o que quer que seja; existe uma maneira de investigar exatamente o que está fazendo atualmente (se houver alguma), nos bastidores?

Seria especialmente útil determinar se ele falhou ou se está apenas realizando uma tarefa demorada. E se não estiver se comportando conforme o esperado, isso poderá ajudar na solução de problemas. Obrigado.

    
por tjt263 01.04.2017 / 17:54

2 respostas

3

Existem duas ferramentas de baixo nível que você pode usar para fazer isso, strace e gdb . A disponibilidade de strace está supondo que você esteja no linux ou no SO onde ele funciona. Para outros sistemas operacionais, você pode ter truss ou dtrace , mas a técnica é semelhante.

strace

Portanto, strace é mais fácil de usar do que gdb e normalmente responde à pergunta "o que é que esta aplicação está a fazer". O uso típico (para mim) seria algo como:

strace -f -tt -s 200 -p $PID

A única opção real que você precisa é o -p $PID . As outras opções apenas adicionam mais informações à linha de saída, mas não são realmente necessárias.

O que isto faz é mostrar todas as chamadas do sistema que o aplicativo está fazendo. A única maneira de um aplicativo estar fazendo algo, e strace não mostrar isso, é se ele é puramente computacional. Ou seja, digitação de números ou algo assim. Coisas como ler / escrever um arquivo, enviar um pacote, obter a hora atual, etc., exigem uma chamada do sistema e serão exibidas.

gdb

gdb é nível inferior a strace . gdb mostrará a linha de código em que o aplicativo está sendo executado. No entanto, existem algumas dicas para isso. O grande problema é que você precisa dos símbolos de depuração para o aplicativo. Nos pacotes fornecidos pela distribuição, estes geralmente foram retirados. No entanto, em distros como os derivados da RedHat, eles geralmente são fornecidos na forma de pkgfoo-debuginfo-1.2.3.rpm . Você pode simplesmente instalar este pacote e recuperar os símbolos. Outra coisa é que, quando strace mostrar o que o aplicativo está fazendo com o tempo, gdb mostra o que o aplicativo está fazendo naquele exato momento, pois congela o processo enquanto você o inspeciona.

Então, o uso é assim:

gdb -p $PID

... que te levará a um shell interativo onde você pode executar algo como:

where

ou

info threads

Não vou entrar em detalhes sobre como usar o gdb , pois dependendo da complexidade do seu aplicativo, ele pode ser complexo e há muitos guias na Internet.

Quando acabar de cutucar o processo e quiser deixá-lo retomar, use apenas quit ou CTRL + D .

    
por 01.04.2017 / 19:35
0

Você pode iniciar a maioria dos processos a partir de uma janela de terminal com saída detalhada adicionando um sinalizador -v . Dessa forma, você verá o que (se alguma coisa) está ocorrendo na janela do terminal quando parece estar travado.

top e htop fornecem informações úteis sobre a execução de processos, incluindo informações atualizadas sobre o uso de mem e cpu, bem como algumas informações de resumo muito úteis também.

Você também pode dar uma olhada nos documentos de comando ps com man ps .

    
por 01.04.2017 / 18:20