GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mengetahui di mana suatu program macet di linux?

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 syscall yang sedang dilakukan program. Cara melacak suatu proses memberi tahu Anda lebih banyak.

Jika Anda bersikeras untuk mendapatkan stacktrace, google memberi tahu saya 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)

Dua jawaban telah diberikan untuk menemukan jejak tumpukan suatu program (ingat untuk menginstal simbol debugging terlebih dahulu!). Jika Anda ingin mengetahui di mana panggilan sistem macet, periksa /proc/PID/stack , yang mencantumkan 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

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 procstack AIX . Tapi di Debian wheezy amd64 saya, sepertinya selalu error. Pada i386, untuk program yang dikompilasi tanpa simbol debug, program tidak mencetak simbol apa pun, bahkan dari pustaka yang simbol debugnya tersedia.

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


Linux
  1. Linux – Bagaimana Mengetahui Apa yang Harus Diambil Di Dmesg?

  2. Bagaimana Gcc Mengetahui Dimana Boost Dipasang?

  3. Bagaimana Cara Memulai Ulang (atau Mengatur Ulang) Proses yang Berjalan Di Linux?

  1. Cara Membuat Thread di Linux (Dengan Program Contoh C)

  2. Bagaimana memprogram file pohon perangkat Linux .dts?

  3. Bagaimana cara mendapatkan id utas dari pthread di program linux c?

  1. Bagaimana cara mengetahui bahwa Java diinstal di sistem Linux?

  2. AVR - Cara memprogram chip AVR di Linux

  3. Bagaimana saya tahu jika saya menjalankan Linux 32 atau 64-bit?