wesom 发表于 2012-5-3 18:13:02

内存出错,打印出错堆栈

前几天有同事问我内存访问出错后如何打印函数调用堆栈,这里记录下。
主要是捕捉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 }
看看出错堆栈感觉还是挺方便的


页: [1]
查看完整版本: 内存出错,打印出错堆栈