2016-05-05 9 views
7

GCC sanitizer w systemach 64-bitowych tworzy huge core files około 17 TB.sanitizer gcc: unmap_shadow_on_exit nie został wyróżniony niestandardowym handlerkiem SIGSEGV

Jeśli chcesz rdzeń do analizy po śmiertelnym trzeba przekazać następujące opcje do odkażający:

  • unmap_shadow_on_exit = 1 - usuwa mapowanie ogromną pamięć, wykorzystywane do prowadzenia domu na wyjeździe

  • disable_core = 0 - stworzone pliki core w systemie 64-bitowym

    Jednakże, jeśli obsługujesz SIGSEGV za pomocą własnego programu obsługi sygnału, unmap_shadow_on_exit nie działa i tworzony jest ogromny plik core.

Wszelkie pomysły jak siła unmap_shadow_on_exit turystyczne to zadanie?

+0

Podajesz łącze, w którym opisano 'use_madv_dontdump', czy próbowałeś? – fghj

+0

@ user1034749 Nie widzę, żeby był obecny w gcc 4.8 – dimba

Odpowiedz

3

Regularne obsługi sygnału nie lost but returned jest, kiedy ustawić obsługi klienta - stąd co potęga praca byłaby po prostu wywołać ten kod jako część własnej obsługi sygnału po po skończeniu z tym, co masz w funkcjonalność twój własny przewodnik.

Więc coś takiego;

sighandler_t oldSigHandler = 0; 
void mySigHandler(int sig) { 
    ... your code ... 
    if (oldSigHandler) oldSigHandler(sig); 
} 

void setMySignalHandler(int sig) { 
    oldSigHandler = signal(sig, mySigHandler); 
} 

Ogólnie uważam, że obsługa sygnałów jest złem i staram się ich unikać - ale to może dla ciebie działać. Ewentualnie, jeśli chcesz tylko uniknąć pliku zrzutu pamięci, możesz spróbować ograniczyć dozwolony rozmiar zrzutu pamięci używając ulimit -c z powłoki lub programmatic z własnego kodu - jednak pliki podstawowe obcięły to sposób nie zawsze działa z gdb, która jest potrzebna.