c/c++ 打印调用栈

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

#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),

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 解析一下符号就可以看到调用到哪个函数了。 

相关推荐

  1. Android Binder 调用

    2024-07-13 19:54:01       47 阅读
  2. 的概念—函数调用

    2024-07-13 19:54:01       19 阅读
  3. 关于调试打印

    2024-07-13 19:54:01       115 阅读
  4. python 调用SumatraPDF 静默打印PDF

    2024-07-13 19:54:01       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 19:54:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 19:54:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 19:54:01       58 阅读
  4. Python语言-面向对象

    2024-07-13 19:54:01       69 阅读

热门阅读

  1. swiper结合gsap进行切换

    2024-07-13 19:54:01       20 阅读
  2. 昇思训练营打卡第二十四天(LSTM+CRF序列标注)

    2024-07-13 19:54:01       17 阅读
  3. Nginx 日志统计分析命令

    2024-07-13 19:54:01       22 阅读
  4. 天童美语:放假给孩子看什么地理纪录片

    2024-07-13 19:54:01       17 阅读
  5. Perl 语言开发(十三):网络编程

    2024-07-13 19:54:01       22 阅读
  6. 块设备驱动实现--模拟一个块设备

    2024-07-13 19:54:01       17 阅读
  7. Docker

    2024-07-13 19:54:01       16 阅读
  8. docker

    2024-07-13 19:54:01       21 阅读
  9. qint64 pendingDatagramSize() const;

    2024-07-13 19:54:01       20 阅读
  10. ThreadLocal有哪些应用场景?底层如何实现?

    2024-07-13 19:54:01       21 阅读
  11. IPython:提升Python编程效率的实用技巧与案例

    2024-07-13 19:54:01       19 阅读
  12. 赋值运算符.二

    2024-07-13 19:54:01       18 阅读
  13. 数据结构第25节 深度优先搜索

    2024-07-13 19:54:01       16 阅读