backtrace打印堆栈的信号问题
来源:互联网 发布:淘宝几十块的近视眼镜 编辑:程序博客网 时间:2024/06/05 22:46
一般工作上,linux通常会使用gdb跟踪堆栈,但是某些情况下(比如core文件较大,core文件不完整),需要采用backtrace来打印堆栈到日志文件中。
如何使用backtrace:
1 #include <execinfo.h>
2 man backtrace,backtrace_symbols 2个接口
3 设置信号捕捉函数
#include <execinfo.h>#include <stdio.h>#include <stdlib.h>#include <signal.h>void print_trace (void){void *array[10];size_t size;char **strings; size_t i;size = backtrace (array, 10);strings = backtrace_symbols (array, size);if (NULL == strings){perror("backtrace_synbols");exit(0);}printf ("Obtained %zd stack frames.\n", size);for (i = 0; i < size; i++)printf ("%s\n", strings[i]);free (strings); strings = NULL;}void dummy_function (void){print_trace ();}void signal_handle(int signo){printf("%s signo:%d\n", __FUNCTION__, signo);dummy_function ();sleep(1);}void build_signal(){struct sigaction act, oact;act.sa_handler = signal_handle;sigemptyset(&act.sa_mask);act.sa_flags = SA_SIGINFO | SA_RESETHAND;sigaction(SIGINT, &act, &oact);sigaction(SIGSEGV, &act, &oact);}int main (int argc, char** argv){build_signal();while(1){sleep(3);}return 0;}由于SIGINT和SIGSEGV信号被捕捉,按下ctrl+c 会进入信号处理函数,但是SA_RESETHAND的参数设置,第二次会默认处理该信号。
正常逻辑需要不但进入信号处理函数打印堆栈,还需要rethrow该信号,暂时没有找到rethrow的方式,只能在信号处理函数中kill一把了,
void signal_handle(int signo){
printf("%s signo:%d\n", __FUNCTION__, signo);
dummy_function ();
sleep(1);
kill(getpid(), signo)
}
0 0
- backtrace打印堆栈的信号问题
- backtrace打印segment堆栈信息
- backtrace-----打印进程异常退出时的堆栈信息
- backtrace-----打印进程异常退出时的堆栈信息
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- backtrace&&backtrace_symbols 查找段错误 打印堆栈信息
- Android下面打印进程函数调用堆栈(dump backtrace)的方法(http://blog.sina.com.cn/happychang2007)
- Android内核中打印backtrace的方法
- backtrace函数与堆栈
- backtrace获取堆栈
- Android 打印backtrace
- 堆栈打印的方法
- 使用backtrace获取堆栈信息
- 使用backtrace获取堆栈信息
- 使用backtrace获取堆栈信息
- 抽象类合接口的区别 (abstract与interface)
- cocos2d 如何将jobject转换成jstring--以及将char*转换成java的jstring
- Android 左右椭圆形状的ProgressBar 的自定义实现
- HDU 1166 敌兵布阵 (树状数组--单点更新,区间求值)
- 黑马程序员 C语言-----数组基本概念 以及选择 冒泡排序理解
- backtrace打印堆栈的信号问题
- java.lang.NullPointerException: Expected timestamp in the Flume event headers, but it was null
- C++ map的基本操作和使用
- Thinkpad X230 安装黑苹果 Mac OSX Mavericks 10.9.2
- strcpy和memcpy的区别
- A. Line to Cashier
- 前缀表达式
- 一步步学习微软InfoPath2010和SP2010--第十二章节--管理和监控InfoPath Form Services(IPFS)(3)--安装Fiddler并监控IPFS表单加载过程
- POJ 3243 大步小步算法