
一、程序前言程序在执行过程中 crash 是崩溃非常严重的问题,一般都应该在测试阶段排除掉这些问题,代码调用但是中何栈信总会有漏网之鱼被带到 release 阶段。 因此,获取函数程序的程序日志系统需要侦测这种情况,在代码崩溃的崩溃时候获取函数调用栈信息,为 debug 提供有效的高防服务器代码调用信息。 这篇文章的中何栈信理论知识很少,直接分享 2 段代码:在 Linux 和 Windows 这 2 个平台上,获取函数如何用C++ 来捕获函数调用栈里的程序信息。 二、崩溃Linux 平台1. 注册异常信号的代码调用处理函数需要处理哪些异常信号 #include <execinfo.h> #include <cxxabi.h> #include <signal.h> const std::map<int, std::string> Signals = { {SIGINT, "SIGINT"}, {SIGABRT, "SIGABRT"}, {SIGFPE, "SIGFPE"}, {SIGILL, "SIGILL"}, {SIGSEGV, "SIGSEGV"} // 可以添加其他信号 }; 注册信号处理函数 struct sigaction action; sigemptyset(&action.sa_mask); action.sa_sigaction = &sigHandler; action.sa_flags = SA_SIGINFO; for (const auto &sigPair : Signals) { if (sigaction(sigPair.first, &action, NULL) < 0) fprintf(stderr, "Error: sigaction failed! n"); } 2. 捕获异常,获取函数调用栈信息void sigHandler(int signum,中何栈信 siginfo_t *info, void *ctx) { const size_t dump_size = 50; void *array[dump_size]; int size = backtrace(array, dump_size); char **symbols = backtrace_symbols(array, size); std::ostringstream oss; for (int i = 0; i < size; ++i) { char *mangleName = 0; char *offsetBegin = 0; char *offsetEnd = 0; for (char *p = symbols[i]; *p; ++p) { if (( == *p) { mangleName = p; } else if (+ == *p) { offsetBegin = p; } else if () == *p) { offsetEnd = p; break; } } if (mangleName && offsetBegin && offsetEnd && mangleName < offsetBegin) { *mangleName++ = |