Bir programın Linux'ta nerede kaldığını nasıl bilebilirim?


44

Ubuntu sunucumda aşağıdaki komutu çalıştırıyorum

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

Süresiz olarak asılı görünüyor. Bu ne zaman AIX’te gerçekleştiyse, sadece rahatsız edici işlemlerin PID’lerini alırdım ve

$ procstack <pid_of_stuck_process>

ve sürecin tüm çağrısını gösterirdi. procstackLinux / Ubuntu'da herhangi bir eşdeğer var mı ?

Yanıtlar:


43

İlk adımım süreçte strace çalıştırmak olacaktır, en iyisi

 strace -s 99 -ffp 12345

İşlem kimliğiniz 12345 ise. Bu işlem programın yaptığı tüm sistemleri gösterir. Bir sürecin nasıl durdurulacağı size daha fazlasını anlatır.

Bir yığın alma konusunda ısrar ediyorsanız, google bana eşdeğerinin pstack olduğunu söyler. Ancak yüklü olmadığı için gdb kullanıyorum:

 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

Bir programın yığın izini bulmak için iki cevap verilmiştir (önce hata ayıklama sembollerini kurmayı unutmayın!). Bir sistem çağrısının nerede durduğunu bulmak istiyorsanız /proc/PID/stack, çekirdek yığınını listeleyen inceleyin . Örnek:

$ 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
NOT: man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (Linux 2.6.29’dan beri) başına bu işlemin çekirdek yığını. Bu dosya yalnızca, çekirdek CONFIG_STACKTRACE yapılandırma seçeneğiyle oluşturulmuşsa sağlanır. "
DocSalvager 13:14

Ayrıca, bu dosyaya erişimin süper kullanıcı veya işlemin kendisiyle sınırlı olduğunu unutmayın (en azından denediğim sistemlerde).
Stéphane Chazelas

Ayrıca /proc/pid/wchanve çıktıdaki WCHANsütuna ps -lveya ps -o wchano yığının üstüne bakın. ( psbölüm birçok Unice üzerinde çalışır, ancak her zaman (çoğu zaman) kendi içinde yararlı değildir).
Stéphane Chazelas

27

Çoğu unix sistemde GDB kullanabilirsiniz .

gdb -batch -ex bt -p 1234

Ayrıca pstack(standart bir yardımcı program değildir, muhtemelen manuel olarak kurmanız gerekir). AIX'in bir eşdeğeri gibi görünüyor procstack. Ama Debian hırıltı amd64'ümde her zaman hata gibi görünüyor. İ386'da, hata ayıklama sembolleri olmadan derlenen bir program için, hata ayıklama simgelerinin bulunduğu kütüphanelerden bile hiçbir sembol yazdırmaz.

strace -p1234İşlem tarafından gerçekleştirilen sistem çağrılarını görmek için de kullanabilirsiniz .


1
pstackHer zaman hatalar atıyor gibi görünüyor. Gibi bir şeyroot@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 amd64'te pstackkırılmış gibi görünüyor, aynı Debian wheezy amd64'te de gözlemliyorum.
Gilles 'SO- kötülük' dur

1
pstack'in README'si bunun yalnızca 32bit, ELF, x86, GNU için olduğunu söylüyor.
Stéphane Chazelas

1

pstacksizin için çalışan bir işlemin yığın izini yazdıracaktır. mevcut değilse / dağıtımınızı / kemerinizi desteklemiyorsa gstackortak bir eşdeğerdir pstack.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.