Bagaimana cara mengetahui di mana program macet di linux?

44

Saya menjalankan perintah berikut di server ubuntu saya

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

Tampaknya menggantung tanpa batas. Setiap kali ini terjadi pada AIX, saya hanya digunakan untuk mendapatkan PID dari proses yang menyinggung dan berkata

$ procstack <pid_of_stuck_process>

dan itu digunakan untuk menunjukkan seluruh proses panggilan. Apakah ada yang setara dengan procstackdi linux / ubuntu?

Pavan Manjunath
sumber

Jawaban:

43

Langkah pertama saya adalah menjalankan strace pada proses, terbaik

 strace -s 99 -ffp 12345

jika ID proses Anda adalah 12345. Ini akan menunjukkan kepada Anda semua syscalls program sedang dilakukan. Cara strace suatu proses memberi tahu Anda lebih banyak.

Jika Anda bersikeras untuk mendapatkan stacktrace, google mengatakan kepada saya bahwa yang setara adalah pstack. Tetapi karena saya belum menginstalnya saya menggunakan 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)
Thorsten Staerk
sumber
33

Dua jawaban telah diberikan untuk menemukan jejak tumpukan suatu program (ingat untuk menginstal simbol debugging terlebih dahulu!). Jika Anda ingin mencari tahu di mana panggilan sistem macet, periksa /proc/PID/stack, yang berisi daftar tumpukan kernel. Contoh:

$ 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
Lekensteyn
sumber
6
CATATAN: per man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (sejak Linux 2.6.29) File ini menyediakan jejak simbolis dari panggilan fungsi dalam tumpukan kernel proses ini. File ini disediakan hanya jika kernel dibangun dengan opsi konfigurasi CONFIG_STACKTRACE. "
DocSalvager
Perhatikan juga akses ke file tersebut terbatas pada superuser atau prosesnya sendiri (setidaknya pada sistem yang saya coba).
Stéphane Chazelas
Lihat juga /proc/pid/wchandan WCHANkolom dalam ps -loutput atau ps -o wchanuntuk bagian atas tumpukan itu. ( psbagian ini berfungsi pada banyak Unix, tetapi tidak selalu (sering) berguna dengan sendirinya).
Stéphane Chazelas
27

Pada sebagian besar sistem unix, Anda dapat menggunakan GDB .

gdb -batch -ex bt -p 1234

Ada juga pstack(bukan utilitas standar, Anda mungkin harus menginstalnya secara manual). Sepertinya setara dengan AIX procstack. Tetapi pada debian saya wheezy amd64, sepertinya selalu salah. Pada i386, untuk program yang dikompilasi tanpa simbol debugging, ia tidak mencetak simbol apa pun, bahkan dari perpustakaan yang simbol debuggingnya tersedia.

Anda juga dapat menggunakan strace -p1234untuk melihat panggilan sistem yang dilakukan oleh proses.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
pstacktampaknya akan melempar kesalahan setiap saat. Sesuatu sepertiroot@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 pstacktampaknya rusak pada amd64, saya amati hal yang sama pada Debian wheezy amd64.
Gilles 'SO- berhenti bersikap jahat'
1
README pstack tidak mengatakan itu hanya untuk 32bit, ELF, x86, GNU.
Stéphane Chazelas
1

pstackakan mencetak jejak tumpukan proses yang berjalan untuk Anda. gstackadalah setara umum jika pstacktidak tersedia / tidak mendukung distro / lengkung Anda.

Philippe Chaintreuil
sumber