LINUX.ORG.RU

Как самому сделать core dump ?


0

0

Я перехватываю сигнал SIGSEGV , пишу в лог типа "кирдык всему",
и делаю exit(-1);
Хотелось бы перед эти еще корку сдампить куда-нибудь , чтоб узанть причину. Демон начинает свою работу так:
if (getppid()!=1)
{ signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
if (fork()!=0) exit(0);
setsid();
}
...
signal(SIGSEGV , sig_dying);
...
Кстати , когда еще небыло обработчика SIGSEGV - то при падении демона
тоже ничего не дампилось. Подозреваю что дело в setsid(). Может кто-нибудь мне внятно обьяснит ? Cпасибо !


Может у тебя ulimit -c в 0 установлен?

Когда мне надо было корку получить, я из нулевого указателя читал :)
Т.е. тот же SIGSEGV.

Havoc ★★★★
()

Можно послать самому себе SIGABRT, т.е. что-то вроде:

signal(SIGABRT,SIG_DFL);
raise(SIGABRT);

а еще проще использовать abort().

На счет того, что core не создается - в некоторых OS
(на счет Linux не знаю) core не записывается если EUID
процесса не совпадает его UID.

anonymous
()

Запусти ulimit -c
Если напишет 0, значит корки создаваться не будут.
Напиши ulimit -c big_number и все будет ок.

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

> Мне же нужна причина получения ПЕРВОГО сигнала SIGSEGV !
Как я понял в свое время, подобное вообще невозможно сделать
системнонезависимым образом. В случае GNUтой libc единственный путь
- подменить SEGV handler через LD_PRELOAD.
Идею можно понять, например, из
http://www.linux.ie/pipermail/ilug/1999-September/006489.html
только вместо "return;" надо сделать нужные действия, а else убрать.

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

Да, прошу прощения - в том примере, что я привел, только идея, и я не уверен, что сработает. Разумеется, надо перекрывать не "signal", а хандлер (если он в glibc сидит, в чем я тоже не уверен). Может, кто ответит, а если нет - надо в исходниках копаться.

Die-Hard ★★★★★
()
Ответ на: комментарий от Teplov


> Вообщем все заработало ...
Правильно ли я понял, что поднятый повторно SIGSEGV производит кору,
в которой место падения обозначено не как перехваченный хандлер,
а как то самое место, где произошло segmentation violation?


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

По -моему да ,
я написал тестик:

void die()
{
fprintf(stderr,"Все щас сдохнет! \n");
signal(SIGSEGV,SIG_DFL);
raise(SIGSEGV);
}


int main()
{
char *ptr=NULL;
signal(SIGSEGV,die);
strcpy(ptr,"Microsoft WINDOWS 2000"); // ;)
return 0;
}

потом gdb -e dead -c core
...
bla bla bla ...
...
#0 strcpy(ptr,"Microsoft WINDOWS 2000"); // ;)
....

вроде указывает .

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