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 .