c/c++ 打印调用栈

打印调用栈可以在程序出现死机的时候(如出现 SIGABRT、SIGSEGV等一些信号错误)是很有用的信息,有可能就不需要 core file 来协助排查问题了。通过 man backtrace 可以得到一个例子的源码:

cpp 复制代码
#define SIZE 100
static void backTracePro(void) 
{ 
    int j, nptrs; 
 
    void *buffer[SIZE]; 
    char **strings; 
    nptrs = backtrace(buffer, SIZE);
    printf("****************************************\n");//这行我自己加的
    printf("backtrace() returned %d addresses\n", nptrs); 

    /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) 
     would produce similar output to the following: */ 
    strings = backtrace_symbols(buffer, nptrs); 
    if (strings == NULL) 
    { 
        perror("backtrace_symbols"); 
        exit(EXIT_FAILURE); 
    } 

    for (j = 0; j < nptrs; j++)
    {
        printf("%s\n", strings[j]); 
    }
    
    free(strings); 
}

然后可以把这个函数放在信号回调函数里,所以先需要设置一下信号处理函数,函数:int sigaction (int __sig, const struct sigaction *__restrict __act, struct sigaction *__restrict __oact),

cpp 复制代码
static bool initSignalCallBack() 
{
    struct sigaction sigact;

    memset(&sigact, 0, sizeof(sigact));
    sigact.sa_handler = signalHandler;

    sigemptyset(&(sigact.sa_mask));

    int ret = sigaction(SIGABRT, &sigact, NULL);
	if(0 == ret)
	{
		ret |= sigaction(SIGSEGV, &sigact, NULL);
	}
	else
	{
		strerror(errno);
		return false;
	}
	
	if(ret)
	{
		strerror(errno);
	}
	
	return ret == 0;
}

所以可以把 backTracePro() 放到信号回调函数 signalHandler() 里,看看执行结果:

接下来用 c++filt 解析一下符号就可以看到调用到哪个函数了。

相关推荐
极地星光8 分钟前
Qt/C++ 单例模式深度解析:饿汉式与懒汉式实战指南
c++·qt·单例模式
yuuki23323325 分钟前
【C++】类和对象(上)
c++·后端·算法
再睡一夏就好31 分钟前
string.h头文件中strcpy、memset等常见函数的使用介绍与模拟实现
c语言·c++·笔记·string·内存函数·strcpy
dangdang___go32 分钟前
动态内存管理||malloc和free.realloc和calloc
c语言·开发语言·算法·动态内存管理
cpp_25011 小时前
P5412 [YNOI2019] 排队
数据结构·c++·算法·题解·洛谷
kingmax542120081 小时前
图论核心算法(C++):包括存储结构、核心思路、速记口诀以及学习方法, 一站式上机考试学习【附PKU百练,相关练习题单】
c++·算法·图论·信奥赛·上机考试·百练·pku
罗湖老棍子1 小时前
【例9.15】潜水员(信息学奥赛一本通- P1271)
c++·算法·动态规划·二维费用背包
xuanzdhc2 小时前
Gitgit
java·linux·运维·服务器·c++·git
程小k3 小时前
迷你编译器
c++·编辑器
云雾J视界3 小时前
从位运算到状态机:用纯C重构红外/DS18B20/I²C协议,告别“黑盒库“的嵌入式实战指南
c语言·数据库·重构