2015-06-18 17 views
5

Chcę móc wygenerować zrzut rdzenia, ale nie można zakończyć procesu. Nie potrzebuję go, by kontynuować egzekucję, po prostu nie umierać. To jest proces Ubuntu w C++.Czy można zrzucić rdzeń, ale nie można zakończyć procesu?

Wierzę, że wyrzucam rdzeń w dość standardowy sposób: łapię sygnał zakłócający poprzez ustawienie obsługi sygnału z sygnałem(), ustawiam limit rozmiaru rdzenia poprzez setrlimit(), a następnie podpowiadam zrzut rdzenia z sygnałem() i podbiciem():

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); 
} 

Czy jest coś, co mogę zrobić, aby nie zakończyć procesu po wyrzuceniu rdzenia?

Dziękuję z góry!

+3

Czy spojrzałeś na to, jak "gcore" to robi? –

+0

Nie znalazłem 'setrlimit()' na liście funkcji asynchronicznych. Czy na pewno dobrze jest wywołać to w programie obsługi sygnału? – EOF

+1

Biblioteka 'coredumper' będzie twoim przyjacielem. –

Odpowiedz

1

Można również zrobić za pomocą gcore:

wygenerować zrzut programu działa z ID procesu PID. Wyprodukowany plik jest odpowiednikiem pliku jądra produkowanego przez jądro, tak jakby proces się zawiesił (a jeśli "ulimit -c" został użyty do ustawienia odpowiedniego limitu zrzutu pamięci). W przeciwieństwie do awarii po gcore program pozostaje bez zmian.

Powiązane problemy