2015-06-18 21 views
5

Çekirdek dökümü oluşturmayı ancak daha sonra işlemden çıkmayı istemiyorum. İnmeye devam etmek için buna ihtiyacım yok, sadece ölme. Bu bir C++ Ubuntu işlemidir.Çekirdeği dökmek mümkün mü, süreçten çıkmak mümkün değil mi?

Çekirdeği oldukça standart bir şekilde döktüğüme inanıyorum: Sinyal işleyicisini sinyal() ile ayarlayarak rahatsız edici sinyali yakalarım, çekirdek boyutu limitini setrlimit() üzerinden ayarlıyorum ve sonra çekirdek dökümü sinyali ile() ve() yükseltmek: Ben çekirdek damping sonra süreç çıkış yok etmek yapabileceği bir şey

signal(SIGSEGV, OnPosixSignal); 

... 

void OnPosixSignal(int iSignal) 
{ 
    struct rlimit CoreLimit; 
    CoreLimit.rlim_cur = RLIM_INFINITY; 
    CoreLimit.rlim_max = RLIM_INFINITY; 
    setrlimit(RLIMIT_CORE, &CoreLimit); 
    signal(iSignal, SIG_DFL); 
    raise(iSignal); 
} 

var mı?

Şimdiden teşekkürler!

+3

Bunu nasıl yaptığınıza bir göz attınız mı? –

+0

Eşzamanlı olmayan işlevler listesinde 'setrlimit()' ı bulunamadı. Sinyal işleyicisine çağırmanın iyi bir fikir olduğuna emin misin? – EOF

+1

'coredumper' kütüphanesi arkadaşınız olacak. –

cevap

1

Ayrıca gcore kullanarak da yapabilirsiniz:

süreç kimliği pid ile çalışan bir programın bir çekirdek dökümü oluşturun. Üretilen dosya kernel tarafından üretilen çekirdek dosyasına, işlem çökerse sanki (ve uygun bir çekirdek boşaltma limiti oluşturmak için "ulimit -c" kullanılıyorsa) eşdeğerdir. Bir çarpışmadan sonra, gotodan sonra program herhangi bir değişiklik yapmadan çalışmaya devam eder.