Süreci öldürmeden proses çekirdeğini boşaltın


12

İşlemleri gerçekten öldürmeden bir süreç için çekirdek dökümü (veya benzer bir şey) almanın bir yolu var mı? Gömülü bir sistemde çalışan bir çok iş parçacıklı python işlemi var. Ve normal koşullar altında (yani çalışması gereken diğer işlemler ile) sürecin bir anlık görüntü almak istiyorum, ama python işlemi olmadan gdb bağlamak (veya gdb altında çalıştırmak) için yeterli bellek yok koşan tek kişi olmak.

Umarım bu soru mantıklıdır.


Bu yalnızca hata ayıklamadaysa, bir NFS dosyasında veya ağ engelleme aygıtında takas gibi çılgınca bir şey düşündünüz mü?
Gilles 'SO- kötü olmayı kes'

Yanıtlar:


13

Her zamanki hile, bir şeyi (muhtemelen bir sinyal gibi SIGUSR1) programı tetiklemektir fork(), daha sonra çocuk abort()kendini çekirdek çekmeye çağırır .

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

ve başlatma sırasında

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

Bu şekilde kullanıldığında, forkfazladan bellek tüketmeyecektir , çünkü adres alanının neredeyse tamamı paylaşılacaktır (bu da çekirdek dökümü oluşturmak için çalışır).

Bir zamanlar bu hile, undumpkarmaşık başlatmadan sonra bir görüntüyü kaydetmek için bir çekirdek dökümünden bir yürütülebilir dosya oluşturmak için çağrılan bir programla kullanıldı ; emacsbunu önceden yüklenmiş bir görüntü oluşturmak için kullanır temacs.


5

Kullanmayı deneyebilirsiniz gcore. Bu senin için bir seçenek mi?


Bir noktada gcore tek başına bir programdı, ancak artık gdb paketinin bir parçası olduğunu sanmıyorum - ancak gdb --pid = <PID> 'ı çalıştırabilir ve daha sonra bir çekirdek dosyayı dökmek için bu gcore komutunu kullanabilirsiniz. gcore.c hafif bir şey istiyorsanız kolayca googlable oldukça basit bir programdır.
sentezleyici
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.