写在前面:
linux下跟踪并打印某程序的堆栈信息指令为:
strace -tT -f [size] [appName]
如在terminal中执行:strace -tT -f -s 1024 ./app
正文:
在项目软件代码开发中,当软件代码量多了后,由于各种疏忽和编码审查不严格,导致代码中存在缺陷,程序运行后总是有各种异常出现,严重的导致程序崩溃,这个时候就期望能够在程序崩溃时,记录异常点相关的堆栈信息,用于对异常的分析,常见的方法有在系统中配置程序崩溃生成coredump文件,后续用gdb分析,这种方法需要了解gdb常用指令,并且涉及到修改了系统的一些配置,同时release版本下,有时候用gdb分析不一定有效,因此本文通过软件代码实现,简单记录程序崩溃的信息,主要使用到的是backtrace、abi::__cxa_demangle、nm、addr2line等函数和指令。
0. 程序中需要用到的头文件信息如下:
#include <iostream>
#include <fstream>
#include <string>
#include <signal.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#if defined (__linux__)
#include <map>
#include <sstream>
#include <fcntl.h>
#include <unistd.h>
#include <execinfo.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/resource.h>
#include <string.h>
#include <cxxabi.h>
#include <math.h>
#endif
1. 注册异常处理函数:
// 信号处理的map集合
static const std::map<int, std::string> gsc_mp4Signals =
{
{SIGSEGV, "SIGSEGV"},
{SIGABRT, "SIGABRT"},
{SIGINT, "SIGINT"},
{SIGFPE, "SIGFPE"},
{SIGILL, "SIGILL"},
{SIGSYS, "SIGSYS"},
{SIGBUS, "SIGBUS"}
// 可以添加其他信号
};
/*************************************************************
* 功能:注册异常处理,linux系统
* ***********************************************************/
static void registerExceptionHandler()
{
// 需要配合nm,addr2line等指令使用
struct sigaction action;
sigemptyset(&action.sa_mask);
action.sa_sigaction = &pfnExceptionHandler_linux;
action.sa_flags = SA_SIGINFO;
for (const auto& signals: gsc_mp4Signals)
{
if (0 > sigaction(signals.first, &action, NULL))
{
printf("Error: sigaction failed!\n");
}
}
return;
}
1.5. 实现异常处理函数之前,还需要实现几个辅助接口,获取进程名称,运行路径,格式化的时间,实现如下:
涉及到的宏定义如下:
#define FORMAT_TIME_MAX_LEN 64 // 格式化时间最长长度
#define APP_NAME_MAX_LEN 128 // APP名称最大长度
#define APP_MAX_LEN 1024 // 定义APP处理最长长度
#define RATIO_1000 1000 // 1000的进率
#define FOLDER_MAX_LEN 512 // 文件夹长度最大值
/**************************

本文介绍如何在Linux环境下,通过编写代码实时捕获程序崩溃时的堆栈信息,包括异常信号、堆栈帧和函数调用链,便于快速定位问题。涉及信号处理、异常处理函数、文件路径获取、时间格式化和backtrace等技术的使用。

1653

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



