Mým prvním krokem by bylo spustit strace na procesu, nejlépe
strace -s 99 -ffp 12345
pokud je vaše ID procesu 12345. To vám ukáže všechna systémová volání, která program provádí. Jak vysledovat proces vám řekne více.
Pokud trváte na získání stacktrace, google mi řekne, že ekvivalentem je pstack. Ale protože ho nemám nainstalovaný, používám 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)
Pro nalezení stopy zásobníku programu byly dány dvě odpovědi (nezapomeňte nejprve nainstalovat ladicí symboly!). Pokud chcete zjistit, kde se systémové volání zaseklo, prozkoumejte /proc/PID/stack
, který uvádí zásobník jádra. Příklad:
$ 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
Na většině unixových systémů můžete použít GDB.
gdb -batch -ex bt -p 1234
Je zde také pstack
(nejedná se o standardní nástroj, pravděpodobně jej budete muset nainstalovat ručně). Vypadá to jako ekvivalent procstack
AIX . Ale na mém Debianu wheezy amd64 se zdá, že vždy dojde k chybě. Na i386 pro program zkompilovaný bez ladicích symbolů nevytiskne žádný symbol, a to ani z knihoven, pro které jsou ladicí symboly k dispozici.
Můžete také použít strace -p1234
abyste viděli systémová volání prováděná procesem.