LINUX.ORG.RU

core dump ?


0

0

возникло несколько вопросов по сабжу
есть прога с кучей процесов
я ставлю свой обработчик сегфаулта
типа
void sig_fault(int signal){
char buf[128];
sprintf(buf,"SIGSEGV Stoping process %d %d\n", getpid(), signal);
write_cr_log(buf);
exit(0);
}
он отрабатывает все хорошо
но в этом случае дампа не создается...
как я понимаю стандартный обработчик каким-то образом
создает дамп, как мне самому это сделать ?
что-то рылся и нигде не нашел...
да вобще как хотябы в лог скинуть имя функции
где завал произошел..
----
вопрос номер 2 :)
процесов куча и когда они все валиться начинают
дапм перезаписывается прежде чем я могу его просмотреть
есть патчи ядра которые позволяют менять имя файла дампа
но это хорошо на своей машине, а на рабочих серваках
нету возможности ковырять ядро, да и геморно это
в общем можно ли опять же например в своем обработчике
как-либо задать имя дампа ?
----
а то запарился уже
вдумчивый просмотр кода отнимает массу времени
с учетом того что время проявления бага может достигать
недель непрерывной работы проги все становиться еще печальнее...

anonymous

>но в этом случае дампа не создается...

Наверное, один из наиболее часто встречающихся вопросов. Обычно он не создается из-за rlimit (bash ulimit).

>в общем можно ли опять же например в своем обработчике >как-либо задать имя дампа ?

Нельзя, но можно, например, создавать директорию в tmp по имени pid и делать туда chdir :)

Murr ★★
()

Когда ты вызываешь signal(), он возвращает адрес старого обработчика. Сохрани его и вызови из нового.

anonymous
()

> как я понимаю стандартный обработчик каким-то образом > создает дамп

это делает ядро, если SIG_DFL

> но в этом случае дампа не создается...

потому и не создается, что есть обработчик. вы можете повторно послать себе тот же сигнал, и у вас будет dump, но процесс погибнет.

если 2.4, то перед посылкой сигнала нужно выставить обработчик в SIG_DFL

> в общем можно ли опять же например в своем обработчике > как-либо задать имя дампа ?

нельзя, но в 2.6 можно изменить политику именования core файлов: /proc/sys/kernel/core_pattern. напишите туда, к примеру "core.%p", и у вас будет суффикс из pid'а процесса. где это документировано я не знаю, но все хорошо видно в fs/exec.c:format_corename()

> да вобще как хотябы в лог скинуть имя функции

можете попробовать LD_PRELOAD=/lib/libSegFault.so

idle ★★★★★
()
Ответ на: комментарий от idle

idle:
>то перед посылкой сигнала нужно выставить обработчик в SIG_DFL

Блин. Вот дурацкая привычка читать по диагонали. :( Как-то я и не заметил, что человек обработчик переустановил.

>нельзя, но в 2.6 можно изменить политику именования core файлов

Ну раз товарищ говорит про патчи, то, наверное, товарищ говорит про ядра, куда этот патч не интегрирован. ;)

Murr ★★
()

есть такая программа - gcore которая задумпит корку любого рабочего процесса, можешь попробовать ее использовать для своих нужд

либо можешь написать небольшой демоночек, который будет мониторить директорию и в случае появления корки переименновывать ее(корку)

lg ★★
()

всем спасибо за ответы
в общем-то решение понятно
делаем сhdir куда надо
скидываем обработчик на дефолтный
и посылаем себе снова сигнал
----
2 idle
>можете попробовать LD_PRELOAD=/lib/libSegFault.so
немножко подробней плиз
я как-то недогнал как мне применить данную информацию %)
-----
2 Murr
да именно про такие, непатченые
на локальной тачке давно стоит какой-то патч
который позволяет широко с названием корки играться
------
2 lg
что-то беглое гугленье не дало линка на сырцы
этой софтины под линух, правда возникло впечатление
что это возможно часть gdb, если вкурсе проясни ситуацию
любопытно взглянуть как прога дампы делает-то...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.