2016-05-05 2 views
7

GCC sanitizer на 64-битных системах создает huge core files около 17 ТБ.gcc sanitizer: unmap_shadow_on_exit не почитается заказчиком SIGSEGV обработчик

Если вы хотите ядро ​​для посмертного анализа вам необходимо пройти следующие параметры для дезинфицирующего:

  • unmap_shadow_on_exit = 1 - снимает отображение огромной памяти, используемую для дома хранения на выходе

  • disable_core = 0 - создано файлы ядра на 64-битной системе

    Однако, если вы обрабатываете SIGSEGV своим собственным обработчиком сигналов, то unmap_shadow_on_exit не работает и создается огромный файл ядра.

Любые идеи, как сила unmap_shadow_on_exit сделать его работу?

+0

Вы предоставляете ссылку, где описано 'use_madv_dontdump', вы попробовали? – fghj

+0

@ user1034749 Я не вижу, что он присутствует в gcc 4.8 – dimba

ответ

3

регулярный обработчик сигнала не lost but returned при установке обработчика клиента - значит, что мощь работа будет просто ссылаться на этот код, как часть вашего собственного обработчика сигнала после того, как после того, как вы закончите с тем, что функциональность у вас есть в ваш собственный обработчик.

Итак, что-то типа;

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

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

Как правило, я воспринимаю обработчики сигналов как зло и стараюсь избегать их, но это может сработать для вас.

В качестве альтернативы, если вы хотите всего лишь избежать файла дампа ядра, вы можете попытаться ограничить разрешенный размер дампа ядра, используя ulimit -c из оболочки или programmatic из вашего собственного кода - однако основные файлы усекали это путь не всегда работает с gdb, который вам нужен.

Смежные вопросы