Woher wissen, wo ein Programm unter Linux hängen bleibt?


44

Ich führe den folgenden Befehl auf meinem Ubuntu-Server aus

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

Es scheint unendlich zu hängen. Wann immer dies unter AIX passierte, habe ich einfach die PID des fehlerhaften Prozesses abgerufen und gesagt

$ procstack <pid_of_stuck_process>

und es zeigte den gesamten Aufrufstapel des Prozesses. Gibt es eine Entsprechung procstackin Linux / Ubuntu?

Antworten:


43

Mein erster Schritt wäre es, den Prozess zu straffen, am besten

 strace -s 99 -ffp 12345

Wenn Ihre Prozess-ID 12345 lautet, werden alle Systemaufrufe angezeigt, die das Programm ausführt. Wie Sie einen Prozess straffen, erfahren Sie mehr.

Wenn Sie darauf bestehen, ein Stacktrace zu erhalten, sagt mir Google, dass das Äquivalent pstack ist. Da ich es aber nicht installiert habe, benutze ich 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

Es wurden zwei Antworten gegeben, um den Stack-Trace eines Programms zu finden (denken Sie daran, zuerst die Debugging-Symbole zu installieren!). Wenn Sie herausfinden möchten, wo ein Systemaufruf hängengeblieben ist, überprüfen Sie /proc/PID/stack, in welcher Liste der Kernel-Stack aufgeführt ist. Beispiel:

$ 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
HINWEIS: per man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (seit Linux 2.6.29) Diese Datei enthält einen symbolischen Trace der Funktionsaufrufe in Kernel-Stack dieses Prozesses. Diese Datei wird nur bereitgestellt, wenn der Kernel mit der Konfigurationsoption CONFIG_STACKTRACE erstellt wurde. "
DocSalvager 13.11.14

Beachten Sie auch, dass der Zugriff auf diese Datei auf den Superuser oder den Prozess selbst beschränkt ist (zumindest auf den Systemen, die ich ausprobiert habe).
Stéphane Chazelas

Siehe auch /proc/pid/wchanund die WCHANSpalte in der ps -lAusgabe oder ps -o wchanfür den Anfang dieses Stapels. (Der psTeil funktioniert auf vielen Unices, ist aber nicht immer (oft) für sich nützlich).
Stéphane Chazelas

27

Auf den meisten Unix-Systemen können Sie GDB verwenden .

gdb -batch -ex bt -p 1234

Es gibt auch pstack(kein Standard-Dienstprogramm, Sie müssen es wahrscheinlich manuell installieren). Es sieht aus wie ein Äquivalent von AIX procstack. Aber auf meinem Debian-Wheezy amd64 scheint es immer einen Fehler zu geben. Auf i386 druckt ein Programm, das ohne Debugging von Symbolen kompiliert wurde, kein Symbol, auch nicht aus Bibliotheken, für die Debugging-Symbole verfügbar sind.

Sie können auch verwenden strace -p1234, um die vom Prozess ausgeführten Systemaufrufe anzuzeigen.


1
pstackscheint jedes Mal Fehler zu werfen. So etwas wieroot@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 pstackscheint auf amd64 kaputt zu sein, ich beobachte dasselbe auf Debian wheezy amd64.
Gilles 'SO - hör auf böse zu sein'


1

pstackdruckt einen Stack-Trace eines laufenden Prozesses für Sie aus. gstackist eine übliche Entsprechung, wenn sie pstacknicht verfügbar ist / Ihre Distribution / Ihren Bogen nicht unterstützt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.