强制内核在挂钩SIGSEGV时转储进程
作者:互联网
我为RAM值非常有限的系统编写应用程序.由于应用程序崩溃始终是可能的并且它使用动态内存分配,因此我为所有可能的方法创建了回调,可以停止应用程序并清理那里的所有缓冲区,如下所示:
sigaddset ( &sigact.sa_mask, SIGSEGV );
sigaction ( SIGSEGV, &sigact, ( struct sigaction* ) NULL );
它会触发一些通知操作并尝试多次重启.
但我仍然想知道导致崩溃的原因,所以我需要crashdump. GDB不适合这么小的系统,只能进行内核级核心转储.
但是当应用程序截获这样的信号并且在它自己退出之后,内核不接收信号 – 没有核心被创建.
我不能发出
kill(getpid(), kernel_signal);
因为它导致递归 – 这个信号也被截获了.在这种情况下,它有可能吗?
解决方法:
也许您可以打印出回溯,而不是核心转储.这应该使用更少的内存,是一个可捕获的信号.请看这个信号处理程序.
#include <execinfo.h>
/* This signal handler ensures clean exits while not running in daemon mode */
void signal_handler(int type)
{
fprintf(stderr, "\nSIGNAL CAUGHT: %d: ", type);
switch (type)
{
case SIGSEGV:
{
#ifdef GLIBC
{
void *array[10];
size_t size;
// get void*'s for all entries on the stack
size = backtrace(array, 10);
// print out all the frames to stderr
fprintf(stderr, "Error: signal %d:\n", type);
backtrace_symbols_fd(array, size, STDERR_FILENO);
// DO CLEANUP HERE
}
#else // Cause ulibc is terrible
fprintf(stderr, "SEGMENTATION FAULT");
// DO CLEANUP HERE
break;
}
#endif
case SIGINT:
case SIGTERM:
case SIGHUP:
default:
{
// DO CLEANUP HERE
}
}
}
标签:c-3,linux,linux-kernel,segmentation-fault,sigsegv 来源: https://codeday.me/bug/20190703/1362413.html