前几天有同事问我内存访问出错后如何打印函数调用堆栈,这里记录下。
主要是捕捉SIGSEGV信号,代码如下:
#include "ace/Stack_Trace.h"
//注册信号
ACE_Sig_Set sig_set;
39 sig_set.sig_add(SIGINT);
40 sig_set.sig_add(SIGQUIT);
41 sig_set.sig_add(SIGSEGV);
42 ACE_Sig_Action sig ((ACE_SignalHandler) SIG_IGN, SIGPIPE); //这个是socket break信号,忽略处理
43 ACE_UNUSED_ARG (sig);
44 if (ACE_Reactor::instance()->register_handler(sig_set, this) == -1)
45 ACE_ERROR_RETURN((LM_ERROR,
46 ACE_TEXT("%p\n"),
47 ACE_TEXT("register_handler")),
48 -1);
...
对应信号处理:
int
18 XXX::handle_signal(int signum, siginfo_t *,ucontext_t *)
19 {
20 if( SIGSEGV == signum ){
21 ACE_Stack_Trace st;
22 ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%D) stack : \n%s\n"), st.c_str()));
23 ACE_Sig_Set sig_set;
24 sig_set.sig_add(SIGSEGV);
25 ACE_Reactor::instance()->remove_handler(sig_set);
26 }
27 ACE_Reactor::end_event_loop();
28
29 ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%D) end event loop\n")));
30 return 0;
31 }
看看出错堆栈感觉还是挺方便的
|