Core dump non-blocking di Linux?

24

Saya mencari cara untuk mengambil coredump non-intrusif dari proses yang berjalan di Linux.

Saya kenal dengan gdb gcore, tapi itu hanya bisa dijalankan ketika gdbdilampirkan ke proses dan dihentikan untuk debugging. Untuk dump core besar yang mungkin berarti beberapa detik, atau bahkan beberapa menit, eksekusi terputus.

Apakah ada alternatif non-pemblokiran?

Linux mendukung memori copy-on-write, yang diandalkan untuk mendukung fork()tanpa exec(). Jadi saya sedang memikirkan sesuatu tingkat kernel di mana kernel mengambil snapshot copy-on-write dari tabel halaman proses dari proses yang dibuang, kemudian menulis inti keluar sementara proses asli terus berjalan.

Saya cukup yakin saya bisa menggunakan gdbuntuk memaksa fork()kemudian membuang anak sementara orang tua melanjutkan dengan bahagia, kemudian wait()pada orang tua untuk menuai anak setelah pemutusan hubungan kerja. Itu berantakan, meskipun, dan masih membutuhkan dua gangguan dari proses induk, meskipun yang pendek.

Tentunya seseorang membutuhkan ini sebelumnya?

Craig Ringer
sumber
Saya menyesal bahwa saya hanya dapat memberikan satu upvote untuk pertanyaan indah ini.
peterh mengatakan mengembalikan Monica
Pertanyaan yang sangat bagus dan saya, untuk satu, menantikan jawabannya. +1 dari saya
thanasisk
1
Bagaimana dengan 1) melampirkan proses dengan gdb 2) biarkan itu forked dengan perintah "call fork" 3) membuang inti dari proses anak 4) membiarkan anak yang mati ditunggu oleh orang tua ("panggilan wait4") 5 ) lepaskan dari proses 6) mengotomatiskan 1-5? Gdb menggunakan panggilan sistem sys_ptrace () sederhana, itu bisa menjadi alat C tidak terlalu rumit yang sepenuhnya independen dari gdb.
peterh mengatakan mengembalikan Monica
1
Pada mesin virtual Anda bisa mengambil snapshot dan membawanya sebagai klon untuk dianalisis. Mungkin salah satu alat yang tercantum di sini akan membantu Anda: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni
1
Anda dapat menghindari gangguan kedua dengan meminta proses anak juga melakukan fork dan kemudian keluar. Kemudian proses orang tua dapat menunggu anak segera dan kemudian melanjutkan, sementara kakek membuang inti.
kasperd

Jawaban:

1

Google CoreDumper muncul dalam pikiran. Itu membuat salinan dari ruang alamat proses copy-on-write, lihat WriteCoreDump () (lihat "Catatan").

EricM
sumber
Itu terlihat sangat berguna! Saya ingin tahu apa teknik dasar yang digunakan. Agaknya itu menghambat proses, tetapi pembuatan snapshot Kontrak Karya tanpa forking dan dengan cara yang tidak memengaruhi tumpukan akan menjadi tantangan. Saya harus melihat kode. Tip yang bagus.
Craig Ringer
Sepertinya itu hanya dalam proses, sayangnya, dan tidak dapat dipanggil melalui gdb atau serupa karena membutuhkan ptrace sendiri. Jadi ini agak seperti DLL debughelp di Windows, daripada seperti gcore yang tidak menghalangi, tetapi masih terlihat sangat berguna. Saya kira itu mungkin untuk digunakan melalui pengait LD_PRELOAD dan pengaturan pengendali sinyal dengan gdb, lepas, dan memberi sinyal proses, tetapi sepertinya tidak benar-benar dirancang untuk membuang program yang tidak dimodifikasi, dan memiliki masalah yang dibagikan oleh alat pembuangan dalam-proses yang jika proses cukup kacau dump tidak akan bekerja.
Craig Ringer
Maaf ... saya melewatkan bit "tidak mengganggu" ketika saya pertama kali membaca pertanyaan.
EricM