linux下使用backtrace记录程序崩溃时的堆栈信息,并进行分析

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

写在前面:

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 // 文件夹长度最大值
/**************************
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值