GNU/Linux >> Znalost Linux >  >> Linux

Jak zjistit, kde je program v linuxu zaseknutý?

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.


Linux
  1. Správci systému Linux chtějí vědět:Kam zmizelo místo na disku?

  2. Linux – Jak vědět, co dělat Grep v Dmesg?

  3. Jak Gcc ví, kde je Boost nainstalován?

  1. Jak vytvářet vlákna v Linuxu (pomocí ukázkového programu C)

  2. Jak programovat soubory stromu zařízení Linux .dts?

  3. Jak získat ID vlákna pthread v programu linux c?

  1. Jak restartovat (nebo resetovat) běžící proces v Linuxu?

  2. Jak zjistit, že Java je nainstalována v systému Linux?

  3. AVR - Jak naprogramovat čip AVR v Linuxu