【发布时间】:2016-09-30 10:33:09
【问题描述】:
我参考了这个 Stack Overflow 问题来测试是否可以捕获和处理 SIGSEGV:
How to automatically generate a stacktrace when my program crashes
文件h.cpp
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void handler(int sig) {
void *array[10];
size_t size = backtrace(array, 10);
// Print out all the frames to stderr
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
int main()
{
int *foo = (int*)-1; // Make a bad pointer
printf("%d\n", *foo); // Causes a segmentation fault
}
我编译它们:
gcc -rdynamic -g h.cpp && ./a.out
结果:
分段错误(核心转储)
好吧,它并没有像我预期的那样打印出调用堆栈。我必须设置任何系统参数吗?
【问题讨论】:
-
您没有在安装处理程序的主函数中注册信号处理程序使用
signal(SIGSEGV, handler);。
标签: c++ linux dynamic trace segmentation-fault