Terkadang, saya memiliki proses Java jahat yang menghabiskan 100% CPU saya dan membuatnya melonjak sekitar 30C pada suhu (biasanya mengakibatkan crash jika tidak dimatikan).
Masalahnya, saya tidak pernah bisa benar-benar mengidentifikasinya (memiliki daftar panjang parameter dan hal-hal lain) atau menganalisisnya karena saya harus membunuhnya dengan sangat cepat.
Apakah ada semacam log yang dapat saya lihat untuk melihat identitas proses sebelumnya yang telah saya matikan? Jika tidak, apakah ada cara bagi saya untuk menangkap proses itu saat muncul lagi?
Jika penting, saya OpenSuse 11.4.
Jawaban yang Diterima:
Tidak, tidak secara default. Ada yang namanya terlalu banyak logging (terutama ketika Anda mulai mengambil risiko logging tindakan menulis entri log…).
Proses akuntansi BSD (jika Anda memilikinya, jalankan lastcomm
), jika aktif, mencatat nama setiap perintah yang dijalankan dan beberapa statistik dasar, tetapi bukan argumennya.
Subsistem audit lebih umum dan lebih fleksibel. Instal audit
paket dan baca panduan audit SuSE (kebanyakan bagian tentang aturan), atau coba
auditctl -A exit,always -F path=/usr/bin/java -S execve
Atau:alih-alih membunuhnya, kill -STOP
dia. STOP menunda proses, tidak ada pertanyaan yang diajukan. Anda mendapatkan opsi untuk melanjutkan (kill -CONT
) atau hentikan (kill -KILL
) nanti. Selama prosesnya masih ada, Anda dapat memeriksa baris perintahnya (/proc/12345/cmdline
), peta memorinya (/proc/12345/maps
) dan seterusnya.
Atau:lampirkan debugger ke proses dan jeda. Sesederhana gdb --pid 12345
(mungkin ada opsi yang lebih baik untuk proses Java); melampirkan debugger segera menghentikan proses (jika Anda keluar dari debugger, proses menerima SIGCONT dan melanjutkan).
Perhatikan bahwa semua ini hanya menangkap proses tingkat OS, bukan utas JVM. Anda perlu beralih ke fitur JVM untuk men-debug utas.