首先我要指出这里的操作系统是 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 信号,我需要做一些特别的事情吗?