まず、オペレーティング システムが RTEMS であることを指摘しておきます。これはオープン ソースの RTOS であり、ソースは次の場所にあります。
ここのドキュメントの sigaction 呼び出しを使用して、SIGSEGV (サポートされていると思われる) のシグナルハンドラーをセットアップする非常に単純なプログラムがあります。
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
}
ただし、問題は、プログラムでセグメンテーション違反を引き起こすと、シグナル ハンドラーが呼び出されず、代わりにvectors_init.c
(RTEMS ソース) でカーネル プロセスが呼び出されてスタック トレースが出力されることです。rtems プログラムで SIGSEGV シグナルを取得するために何か特別なことをする必要がありますか?