作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我为一个 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/
我正在为我的应用程序使用 Tank-Auth。我唯一的问题是激活和重置帐户密码。 用于登录、注册、注销;我对这些代码没有问题; $route['login'] = "/auth/login"; $ro
我是一名优秀的程序员,十分优秀!