как поймать сегфо без дампа ядра - PullRequest
0 голосов
/ 28 апреля 2018

Я делаю программу, которая должна знать, имел ли его ребенок segfault во время выполнения.

для segfault с дампом ядра и без. для первого я сделал это без проблем, но я не могу найти, что могло бы сделать меня неспособным поймать этот сигнал. Согласно справочной странице, я должен получить 10,7,10, но я не уверен, что это значит, и я могу попробовать только один из них, но 10 и 7 ничего не сделали

if (WTERMSIG(status) == 10)
    my_putstr("Segmentation fault \n");
else if (WTERMSIG(status) == 11)
    my_putstr("Segmentation fault (core dumped)\n");

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

if (WTERMSIG(status) == 10) my_putstr("Segmentation fault \n"); else if (WTERMSIG(status) == 11) my_putstr("Segmentation fault (core dumped)\n");

Сигнал 10 обычно SIGBUS, а сигнал 11 обычно SIGSEGV. Они имеют в виду разные вещи. Печать "ошибка сегментации" для обоих сбивает с толку и неверно.

Кроме того, core был выгружен или нет является ортогональным , на который был получен какой-либо из вышеуказанных сигналов: если ваш ulimit -c не равен 0, а назначение core доступно для записи, тогда оба сигнала будут генерировать core. Кроме того, другие сигналы (например, SIGILL) также будут генерировать core по умолчанию.

Вот то, что вы, вероятно, хотите:

if (WIFSIGNALED(status)) {
  printf("Terminated by signal %d%s\n", WTERMSIG(status),
         WCOREDUMP(status) ? " (core dumped)" : "");
}
0 голосов
/ 28 апреля 2018

Ваш вопрос немного неясен, но вы можете использовать WIFSIGNALED(), чтобы проверить, получил ли дочерний процесс какой-либо сигнал или нет, если WIFSIGNALED(status) истинно, означает, что дочерний процесс завершается ненормально любым сигналом.

if(fork() == 0 ) {
    /*... */
    /* send the exit status of child by calling exit()*/
}
else {
        int status;
        wait(&status);/* here parent collect exit status , now  parent wants to know--> normal termination or abnormal */

        if(WIFEXITED(status)) { /* true if terminates normally */
                printf("normally terminates\n",WEXITSTATUS(status));
        }
        if(WIFSIGNALED(status)) { /* if child terminated bcz of any other signal */             
                printf("terminated by signal\n",WTERMSIG(status));// bcz of what signal 
        }
}

Чтобы узнать, получил ли ребенок SIGSEGV без дампа памяти, в приведенном выше коде, как только ребенок получит SIGSEGV, вы можете установить обработчик сигнала, вызвав sigaction() и сделав некоторые вещи.

...