linux c/c++ 程序崩溃时打印调用栈
本文章是在总结前人的帖子后实现的,经过验证是可以使用的。但是在个别信号下,还是不能详细的打印有效信息。void dump(void){ char szLog[MAX_LOG_LEN] = {0}; int j, nptrs; const int BACKTRACE_SIZE = 16; void *buffer[BACKTRACE_SIZE
本文章是在总结前人的帖子后实现的,经过验证是可以使用的。
但是在个别信号下,还是不能详细的打印有效信息。
void dump(void)
{
char szLog[MAX_LOG_LEN] = {0};
int j, nptrs;
const int BACKTRACE_SIZE = 16;
void *buffer[BACKTRACE_SIZE];
char **strings;
nptrs = backtrace(buffer, BACKTRACE_SIZE);
snprintf(szLog, MAX_LOG_LEN, "backtrace() returned %d addresses", nptrs);
CLogError(szLog);
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
{
snprintf(szLog, MAX_LOG_LEN, " [%02d] %s", j, strings[j]);
CLogError(szLog);
}
free(strings);
char buff[128] = { 0x00 };
snprintf(buff, 128, "cat /proc/%d/maps", getpid());
CLogError(buff);
system((const char*)buff);
}
void signal_handler(int signo)
{
char szLog[MAX_LOG_LEN] = {0};
snprintf(szLog, MAX_LOG_LEN, "\n=========>>>catch signal %d <<<=========\n", signo);
CLogError(szLog);
CLogError("Dump stack start...\n");
dump();
CLogError("Dump stack end...\n");
signal(signo, SIG_DFL);
raise(signo);
}
在主函数终注册信号回调函数
signal(SIGSEGV, signal_handler);
signal(SIGABRT, signal_handler);
更多推荐
所有评论(0)