直接上代碼吧 debug.h 如下
#ifndef __COMMON_DEBUG__
#define __COMMON_DEBUG__
#include <signal.h>
typedef int signal_t;
typedef void (*SignalHandler)(signal_t sig_no);
typedef void (*SignalHandlerContext)(signal_t sig_no, siginfo_t *info, void *secret);
namespace common{
class CSignalDebug{
public:
void SetHandler(signal_t signo, SignalHandler sig_func);
void SetHandler(signal_t signo, SignalHandlerContext sig_func);
static void PrintBackStrace(signal_t sig_no, siginfo_t *info, void *secret);
};
};
debug.cc
#include "debug.h"
#include "stdio.h"
#include <execinfo.h>
#include "debug.h"
#include<iostream>
using namespace std;
namespace common{
void CSignalDebug::SetHandler(signal_t signo, SignalHandler sig_func){
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler = *sig_func;
sigaction(signo, &act, NULL);
}
void CSignalDebug::SetHandler(signal_t signo, SignalHandlerContext sig_func){
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
act.sa_sigaction = *sig_func;
sigaction(signo, &act, NULL);
}
void CSignalDebug:: PrintBackStrace(signal_t sig_no, siginfo_t *info, void *secret){
void *trace[100];
int trace_size = 0;
char **message = NULL;
trace_size = backtrace(trace, 100);
message = backtrace_symbols(trace, trace_size);
}
}