Linux üzerinde engelleyici olmayan çekirdek dökümü?


24

Linux'ta çalışan bir sürecin müdahaleci olmayan bir aldatmaca almak için bir yol arıyorum.

GdB'leri tanıyorum gcore, ancak bu yalnızca sürece gdbeklendiğinde ve hata ayıklama için durdurulduğunda çalıştırılabilir . Kesintisiz infazın birçok saniyesi, hatta birkaç dakikası anlamına gelebilecek büyük bir çekirdek dökümü için.

Herhangi bir engelleyici olmayan alternatif var mı?

Linux destekleri üzerine kopyalama yazma o destek için dayandığı bellek, fork()olmadan exec(). Bu yüzden, çekirdeğin, atılmakta olan işlemin işlem sayfa tablolarının bir kopyasını yazarken anlık görüntüsünü aldığı çekirdek düzeyinde bir şey düşünüyorum, sonra orijinal işlem devam ederken çekirdeği yazıyor.

Ebeveynim mutlu bir şekilde devam ederken çocuğu terk gdbetmeye zorlamak için kullanabileceğimden eminim fork(), daha sonra wait()ebeveyni sona erdikten sonra çocuğu biçmek için. Yine de dağınık ve ana süreçte kısa da olsa iki kesinti gerektiriyor.

Elbette daha önce buna ihtiyaç var mı?


Üzgünüm, bu harika soru için sadece tek bir oy verebiliyorum.
peterh Monica 11:14

Mükemmel bir soru ve ben, birincisi, cevabı bekliyorum. +1 benden
thanasisk

1
Peki ya 1) süreci gdb'ye eklemek 2) bir "çağrı çatalı" komutu ile çatallanmasına izin ver 3) çocuk işleminin çekirdeğini dökmek 4) ölü çocuğun ebeveyn tarafından beklemesini sağlamak (başka bir "çağrı bekle 4") 5 (işlem 6'dan ayrıl) 6) 1-5'i otomatikleştir. Gdb, basit sys_ptrace () sistem çağrılarını kullanır, gdb'den tamamen bağımsız olmayan, gerçekten karmaşık olmayan bir C aracı olabilir.
peterh, Monica

1
Sanal bir makinede anlık görüntü alabilir ve bunu analiz edilecek bir klon olarak gösterebilirsiniz. Belki burada listelenen araçlardan biri size yardımcı olacaktır: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni

1
Çocuk sürecini aynı zamanda çatallayıp çıkardıktan sonra ikinci kesintiden kaçınabilirsiniz. Sonra ebeveyn süreci hemen çocuğu bekleyebilir ve daha sonra büyükbaba çekirdeği dökerken devam eder.
kasperd

Yanıtlar:


1

Google CoreDumper akla yaylar. İşlemin adres alanının bir kopyasını yazma kopyası yapar, bkz. WriteCoreDump () (bkz. "Notlar").


Bu son derece yararlı görünüyor! Kullanılan tekniğin ne olduğunu merak ediyorum. Muhtemelen süreci pekiştirir, ancak CoW anlık görüntüsünün çatal olmadan ve istifleri etkilemeyecek şekilde oluşturulması zor olacaktır. Koda bir göz atmam gerekecek. Harika bir bahşiş.
Craig Ringer

Görünüşe göre sadece süreçte maalesef gdb veya benzeri yöntemlerle çalıştırılamaz, çünkü kendi kendini geliştirmek ister. Yani biraz engelleyici olmayan bir gcore gibi, Windows altında debughelp DLL gibi, ama yine de çok kullanışlı bir görünüm. Bir LD_PRELOAD kancası ve gdb ile bir sinyal işleyicisinin kurulumu ve kullanımı ile işlemin mümkün olabileceğini tahmin ediyorum, ancak süreci işaretleyebiliyor, ancak değiştirilmemiş programları boşaltmak için tasarlanmış gibi görünüyor ve sorunu paylaşıyor Herhangi bir işlem içi boşaltma aracı tarafından işlem yeterince karışıksa, boşaltma işlemez.
Craig Ringer

Üzgünüm… İlk soruyu okuduğumda "müdahaleci olmayan" bir kısmı kaçırdım.
EricM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.