Como saber onde um programa está preso no linux?

44

Estou executando o seguinte comando no meu servidor ubuntu

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

Parece travar indefinidamente. Sempre que isso acontecia no AIX, eu simplesmente obtinha o PID do processo ofensivo e dizia

$ procstack <pid_of_stuck_process>

e costumava mostrar toda a pilha de chamadas do processo. Existe algum equivalente procstackno linux / ubuntu?

Pavan Manjunath
fonte

Respostas:

43

Meu primeiro passo seria acompanhar o processo, melhor

 strace -s 99 -ffp 12345

se o seu ID do processo for 12345. Isso mostrará todos os syscalls que o programa está executando. Como rastrear um processo conta mais.

Se você insiste em obter um rastreamento de pilha, o Google me diz que o equivalente é pstack. Mas como não o tenho instalado, 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)
Thorsten Staerk
fonte
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 do sistema ficou travada, examine a /proc/PID/stacklista da 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
Lekensteyn
fonte
6
NOTA: por man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (desde o Linux 2.6.29) Este arquivo fornece um rastreamento simbólico das chamadas de função em pilha do kernel deste processo. Este arquivo é fornecido apenas se o kernel foi construído com a opção de configuração CONFIG_STACKTRACE. "
DocSalvager
Observe também que o acesso a esse arquivo está limitado ao superusuário ou ao próprio processo (pelo menos nos sistemas que eu tentei).
Stéphane Chazelas
Veja também /proc/pid/wchane a WCHANcoluna na ps -lsaída ou ps -o wchanpara o topo dessa pilha. (a pspeça funciona em muitos Unices, mas nem sempre (geralmente) é útil por si só).
Stéphane Chazelas
27

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

gdb -batch -ex bt -p 1234

Também existe pstack(não é um utilitário padrão, você provavelmente precisará instalá-lo manualmente). Parece um equivalente ao AIX procstack. Mas no meu Debian wheezy amd64, parece sempre erro. No i386, para um programa compilado sem símbolos de depuração, ele não imprime nenhum 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 -p1234para ver as chamadas do sistema realizadas pelo processo.

Gilles 'SO- parar de ser mau'
fonte
1
pstackparece estar lançando erros toda vez. Algo como #root@sarai:~# pstack 6312 6312: /usr/bin/python /usr/bin/twistd -n --uid=maas --gid=maas --pidfile=/run/maas-pserv.pid --logfile=/dev/null maas-pserv --conf... (No symbols found) crawl: Input/output error Error tracing through process 6312
Pavan Manjunath
O @PavanManjunath pstackparece estar quebrado no amd64, eu observo o mesmo no Debian wheezy amd64.
Gilles 'SO- stop be evil'
1
O README do pstack diz que é apenas para 32 bits, ELF, x86, GNU.
Stéphane Chazelas
1

pstackimprimirá um rastreamento de pilha de um processo em execução para você. gstacké um equivalente comum se pstacknão estiver disponível / não suportar sua distribuição / arco.

Philippe Chaintreuil
fonte