我的系统配置如下:
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30277
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
情况一:程序中没有调用backtrace、backtrace_symbols函数,程序崩溃时候,能生成core文件,
情况二:程序中调用了backtrace、backtrace_symbols函数,程序崩溃时候,不能生成core文件。
请问各路大神,有没有什么办法能够让程序崩溃时候 既能生成core文件,又能在在日志中将崩溃时候的 堆栈信息打印出来(通过调用backtrace、backtrace_symbols函数实现)?
补充下我的代码:
以下代码分别注册SIGSEGV信号、SIGABRT信号的信号毁掉函数
signal(SIGSEGV, WidebrightSegvHandler); // SIGSEGV 11
signal(SIGABRT, WidebrightSegvHandler); // SIGABRT 6
以下代码为信号注册函数
static void WidebrightSegvHandler(int signum)
{
void *array[10];
size_t size;
char **strings;
size_t i, j;
signal(signum, SIG_DFL);
size = backtrace (array, 15);
strings = (char **)backtrace_symbols (array, size);
//fprintf(stderr, "widebright received SIGSEGV! Stack trace:\n");
log.info("widebright received SIGSEGV! Stack trace:\n");
for (i = 0; i < size; i++)
{
//fprintf(stderr, "%d %s \n",i,strings[i]);
log.info("%d %s \n",i,strings[i]);
}
free (strings);
exit(1);
}
我猜想是否 是因为我代码中注册了SIGSEGV、SIGABRT的信号函数,
当发生段错误时候,信号SIGSEGV,被我的程序捕获了,系统配置生成core的相关模块没有受到信号SIGSEGV,
因此就产生不了core文件。也就是说说core文件的生成依赖于SIGSEGV信号,没有收到信号就不会产生?