找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4428|回复: 0

内存出错,打印出错堆栈

[复制链接]
发表于 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 }
看看出错堆栈感觉还是挺方便的


您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-4 01:53 , Processed in 0.056495 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表