Inti proses pembuangan tanpa membunuh proses


12

Apakah ada cara untuk mendapatkan dump inti (atau sesuatu yang serupa) untuk suatu proses tanpa benar-benar membunuh proses? Saya memiliki proses python multithreaded yang berjalan pada sistem tertanam. Dan saya ingin bisa mendapatkan snapshot dari proses dalam kondisi normal (yaitu dengan proses lain yang diperlukan untuk menjalankan), tetapi saya tidak memiliki cukup memori untuk menghubungkan gdb (atau menjalankannya di bawah gdb) tanpa proses python menjadi satu-satunya yang berjalan.

Saya harap pertanyaan ini masuk akal.


Jika ini hanya saat Anda sedang debug, sudahkah Anda menganggap sesuatu yang gila seperti bertukar pada file NFS atau perangkat blok jaringan?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


13

Trik yang biasa adalah memiliki sesuatu (mungkin seperti sinyal SIGUSR1) untuk memicu program fork(), kemudian anak tersebut memanggil abort()untuk membuat sendiri dump core.

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

dan selama inisialisasi

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

Digunakan dengan cara ini, forktidak akan menghabiskan banyak memori tambahan karena hampir semua ruang alamat akan dibagikan (yang juga mengapa ini bekerja untuk menghasilkan dump inti).

Sekali waktu trik ini digunakan dengan program yang dipanggil undumpuntuk menghasilkan executable dari dump inti untuk menyimpan gambar setelah inisialisasi yang kompleks; emacsdigunakan untuk melakukan ini untuk menghasilkan gambar yang dimuat sebelumnya temacs.


5

Anda dapat mencoba menggunakan gcore. Apakah itu pilihan untuk Anda?


Pada suatu titik gcore adalah program yang berdiri sendiri tetapi saya tidak berpikir itu bagian dari paket gdb lagi - namun Anda dapat menjalankan gdb --pid = <PID> dan kemudian menggunakan perintah gcore itu untuk membuang file inti. gcore.c adalah program yang cukup sederhana yang mudah googlable jika Anda menginginkan sesuatu yang lebih ringan.
synthesizerpatel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.