gpt4 book ai didi

c - Hook SIGSEGV 时强制内核转储进程

转载 作者:IT王子 更新时间:2023-10-29 00:35:06 24 4
gpt4 key购买 nike

我为一个 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 - Hook SIGSEGV 时强制内核转储进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27077339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com