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 .