Jak wiedzieć, gdzie program utknął w systemie Linux?


44

Na moim serwerze Ubuntu uruchamiam następujące polecenie

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

Wydaje się zawieszać na czas nieokreślony. Ilekroć tak się działo w systemie AIX, po prostu uzyskiwałem PID procesu obrażania i mówiłem

$ procstack <pid_of_stuck_process>

i pokazywał cały callstack całego procesu. Czy istnieje jakiś odpowiednik procstacklinux / ubuntu?

Odpowiedzi:


43

Moim pierwszym krokiem byłoby najlepiej śledzić proces

 strace -s 99 -ffp 12345

jeśli twój identyfikator procesu to 12345. Wyświetli to wszystkie wywołania systemowe wykonywane przez program. Jak przeprowadzić proces mówi ci więcej.

Jeśli nalegasz na uzyskanie stacktrace, Google mówi mi, że odpowiednikiem jest pstack. Ale ponieważ nie mam go zainstalowanego, używam 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)

33

Podano dwie odpowiedzi na znalezienie śladu stosu programu (pamiętaj, aby najpierw zainstalować symbole debugowania!). Jeśli chcesz dowiedzieć się, gdzie utknęło wywołanie systemowe, sprawdź /proc/PID/stack, która lista zawiera stos jądra. Przykład:

$ 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

6
UWAGA: per man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (od Linuksa 2.6.29) Ten plik zawiera symboliczny ślad wywołań funkcji w stos jądra tego procesu. Ten plik jest dostarczany tylko wtedy, gdy jądro zostało zbudowane z opcją konfiguracji CONFIG_STACKTRACE.
DocSalvager,

Pamiętaj też, że dostęp do tego pliku jest ograniczony do superużytkownika lub samego procesu (przynajmniej na systemach, które wypróbowałem).
Stéphane Chazelas,

Zobacz także /proc/pid/wchani WCHANkolumnę w ps -ldanych wyjściowych lub ps -o wchanna górze tego stosu. ( psczęść działa na wielu Unikach, ale nie zawsze (często) jest przydatna sama w sobie).
Stéphane Chazelas,

27

W większości systemów uniksowych możesz używać GDB .

gdb -batch -ex bt -p 1234

Jest też pstack(nie jest to standardowe narzędzie, prawdopodobnie będziesz musiał zainstalować go ręcznie). Wygląda jak odpowiednik systemu AIX procstack. Ale w moim debiutującym amd64 na Debianie wydaje się, że zawsze występuje błąd. Na i386, dla programu skompilowanego bez symboli debugowania, nie drukuje żadnego symbolu, nawet z bibliotek, dla których dostępne są symbole debugowania.

Możesz także użyć, strace -p1234aby zobaczyć wywołania systemowe wykonywane przez proces.


1
pstackwydaje się, że za każdym razem powoduje błędy. Coś w styluroot@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,

@PavanManjunath pstackwydaje się być zepsuty na amd64, obserwuję to samo na Debian wheezy amd64.
Gilles „SO- przestań być zły”

1
README pstack mówi, że jest to tylko wersja 32-bitowa, ELF, x86, GNU.
Stéphane Chazelas,

1

pstackwydrukuje dla ciebie ślad stosu uruchomionego procesu. gstackjest wspólnym odpowiednikiem, jeśli pstacknie jest dostępny / nie obsługuje twojej dystrybucji / arch.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.