Como saber onde um programa está preso no linux?

43

Estou executando o seguinte comando no meu servidor ubuntu

root@slot13:~# lxc-stop --name pavan --logfile=test1.txt --logpriority=trace

Parece pendurar indefinidamente. Sempre que isso aconteceu no AIX, eu costumava pegar o PID do processo ofensivo e dizer

$ procstack <pid_of_stuck_process>

e costumava mostrar todo o callstack do processo. Existe algum equivalente de procstack no linux / ubuntu?

    
por Pavan Manjunath 07.11.2014 / 05:55

4 respostas

42

Meu primeiro passo seria executar strace no processo, melhor

 strace -s 99 -ffp 12345

se o seu ID de processo for 12345. Isso mostrará todos os syscalls que o programa está fazendo. Como avaliar um processo diz mais a você.

Se você insistir em obter um stacktrace, o google me diz que o equivalente é pstack. Mas como eu não tenho instalado eu uso o gdb:

 tweedleburg:~ # sleep 3600 &
 [2] 2621
 tweedleburg:~ # gdb
 (gdb) attach 2621
 (gdb) bt
 #0  0x00007feda374e6b0 in __nanosleep_nocancel () from /lib64/libc.so.6
 #1  0x0000000000403ee7 in ?? ()
 #2  0x0000000000403d70 in ?? ()
 #3  0x000000000040185d in ?? ()
 #4  0x00007feda36b8b05 in __libc_start_main () from /lib64/libc.so.6
 #5  0x0000000000401969 in ?? ()
 (gdb)
    
por 07.11.2014 / 06:05
33

Duas respostas foram dadas para encontrar o rastreamento de pilha de um programa (lembre-se de instalar os símbolos de depuração primeiro!). Se você quiser descobrir onde uma chamada de sistema ficou travada, examine /proc/PID/stack , que lista a pilha do kernel. Exemplo:

$ cat /proc/self/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
    
por 07.11.2014 / 10:17
28

Na maioria dos sistemas unix, você pode usar o GDB .

gdb -batch -ex bt -p 1234

Há também pstack (não é um utilitário padrão, você provavelmente precisará instalá-lo manualmente). Parece um equivalente do procstack do AIX. Mas no meu Debian wheezy amd64, parece sempre errar. No i386, para um programa compilado sem símbolos de depuração, ele não imprime qualquer símbolo, nem mesmo de bibliotecas para as quais os símbolos de depuração estão disponíveis.

Você também pode usar strace -p1234 para ver as chamadas do sistema realizadas pelo processo.

    
por 07.11.2014 / 06:06
0

pstack imprimirá um rastreamento de pilha de um processo em execução para você. gstack é um equivalente comum se pstack não estiver disponível / não for compatível com sua distribuição / arco.

    
por 18.06.2018 / 16:04