Mein erster Schritt wäre, am besten strace für den Prozess auszuführen
strace -s 99 -ffp 12345
wenn Ihre Prozess-ID 12345 ist. Dies zeigt Ihnen alle Systemaufrufe, die das Programm durchführt. Wie man einen Prozess verfolgt, sagt Ihnen mehr.
Wenn Sie darauf bestehen, einen Stacktrace zu erhalten, sagt mir Google, dass das Äquivalent pstack ist. Aber da ich es nicht installiert habe, verwende 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)
Es wurden zwei Antworten gegeben, um den Stack-Trace eines Programms zu finden (denken Sie daran, zuerst Debugging-Symbole zu installieren!). Wenn Sie herausfinden möchten, wo ein Systemaufruf hängen geblieben ist, untersuchen Sie /proc/PID/stack
, die den Kernel-Stack auflistet. 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
Auf den meisten Unix-Systemen können Sie GDB verwenden.
gdb -batch -ex bt -p 1234
Es gibt auch pstack
(kein Standarddienstprogramm, Sie müssen es wahrscheinlich manuell installieren). Es sieht aus wie ein Äquivalent zu procstack
von AIX . Aber auf meinem Debian wheezy amd64 scheint es immer einen Fehler zu geben. Auf i386 gibt es für ein Programm, das ohne Debugging-Symbole kompiliert wurde, keine Symbole aus, nicht einmal aus Bibliotheken, für die Debugging-Symbole verfügbar sind.
Sie können auch strace -p1234
verwenden um die vom Prozess ausgeführten Systemaufrufe anzuzeigen.