#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <stdlib.h>
#include<string.h>
#define TRACE_SIZE 1024
static void trace_print(int signal_type)
{
size_t size;
//void *buffer[100];
char **info = NULL;
int i = 0;
void *traceBuff[TRACE_SIZE];
size = backtrace(traceBuff, TRACE_SIZE);
//signal(signal_type,SIG_DFL);
info = backtrace_symbols(traceBuff, size);
if (NULL == info)
{
return;
}
fprintf(stderr,"System error, Stack trace:\n");
for (i = 0; i < size; ++i)
{
fprintf(stderr,"%d %s \n",i,info[i]);
}
//free(info);
}
void Fun1()
{
char *p=NULL;
*p = 'A';
}
void Fun()
{
Fun1();
}
static void signal_hadle_fun(int signal_type)
{
switch(signal_type)
{
case SIGHUP:
case SIGINT:
case SIGQUIT:
case SIGILL:
case SIGTRAP:
case SIGABRT:
case SIGBUS:
case SIGFPE:
case SIGKILL:
case SIGSEGV:
case SIGPIPE:
case SIGTERM:
trace_print(signal_type);
break;
}
}
int main(void)
{
//pid_t pid = fork();
//char *str = "hello";
//str[0] = 'h';
signal(SIGHUP, signal_hadle_fun);
signal(SIGINT, signal_hadle_fun);
signal(SIGQUIT, signal_hadle_fun);
signal(SIGILL, signal_hadle_fun);
signal(SIGTRAP, signal_hadle_fun);
signal(SIGABRT, signal_hadle_fun);
signal(SIGBUS, signal_hadle_fun);
signal(SIGFPE, signal_hadle_fun);
signal(SIGKILL, signal_hadle_fun);
signal(SIGSEGV, signal_hadle_fun);
signal(SIGPIPE, signal_hadle_fun);
signal(SIGTERM, signal_hadle_fun);
Fun();
return 0;
}
C语言捕捉异常信号打印堆栈信息例子
最新推荐文章于 2024-02-19 10:41:29 发布