2014-12-31 2 views
2

Для начала я укажу операционную систему здесь RTEMS, он является открытым исходным кодом RTOS и источник можно найти здесь:Причинение в программе выдаёт ошибку сегментации не попадитесь обработчика сигнала

http://git.rtems.org/rtems/

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

http://docs.rtems.org/releases/rtemsdocs-4.9.2/share/rtems/html/posix_users/posix_users00033.html

Моя программа по существу вскипает к этому:

void HandleAndPrintSignal() 
{ 
    printf("I am in the segfault signal handler AND I WILL HANDLE YOUR SIG!!!!\n"); 
    exit(1); 
} 

void *POSIX_Init(void *args) 
{ 
    printf("BENS BIG NOTE: Initializing Signal Handler\n"); 
    struct sigaction sa; 
    sa.sa_handler = HandleAndPrintSignal; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = SA_SIGINFO; 
    if (sigaction (SIGSEGV, &sa, 0)) { 
     printf("A ERROR OCCURED WITH THIS!"); 
     exit(1); 
    } 

    int *p = NULL; 
    *(p--) = 5; // Causes segfault 
} 

Однако, проблема заключается в том, что, когда я вызвать Segfault в моей программе, обработчик сигнала не вызывается, но вместо того, чтобы процесс ядра называется в vectors_init.c (источник RTEMS) для печати трассировки стека , Есть ли что-то особенное, что мне нужно сделать, чтобы получить сигнал SIGSEGV в моей программе rtems?

+0

Полностью ли RTEMS поддерживает обработку сигналов POSIX? –

+0

@JoachimPileborg Насколько я могу судить, он: http://docs.rtems.org/doc-current/share/rtems/pdf/posix1003_1.pdf в разделе 3.3.1.1, он определяет сигналы и SIGSEGV как реализованные. –

+0

Я не думаю, что вы вызываете 'printf' или' exit' из обработчика сигнала. –

ответ

0

Таким образом, объяснение этого заключается в том, что RTEMS не обрабатывает сигналы так, как я думал.

Есть некоторые сигналы POSIX, которые на самом деле являются исключениями на аппаратном уровне. например. SIGSEGV, SIGBUS, и SIGFPE. Точная семантика того, что возможно, когда это происходит, определяется POSIX, но магия начинается с архитектуры и специфического обработчика BSP. Поскольку общее правило состоит в том, чтобы избежать этих ошибок во встроенных системах, действие по умолчанию часто является чем-то вроде трассировки стека ядра или другого конкретного кода BSP.

Некоторые BSP имеют поддержку для установки дополнения к обработчику исключений, который будет распространять аппаратную ошибку в программный сигнал, но это в основном используется для получения SIGFPE на таких языках, как Ada, сопоставленных с обработчиками исключений для конкретных языков.

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

Вкратце: для того, чтобы получить желаемое поведение, мне нужен код, который установлен, который отображает аппаратные исключения -> сигналы POSIX.

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