本文章是在总结前人的帖子后实现的,经过验证是可以使用的。
但是在个别信号下,还是不能详细的打印有效信息。
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);

本文介绍了一种用于捕获特定信号并打印堆栈跟踪的方法。通过注册信号回调函数,当程序接收到如SIGSEGV等信号时,能够调用自定义函数dump来收集当前的运行状态信息,包括调用栈回溯地址、进程内存映射等。
5万+

被折叠的 条评论
为什么被折叠?



