C++后台服务崩溃堆栈日志
C++后台服务崩溃堆栈日志
C/C++后台服务运行过程中总会出现一些不容易重现的崩溃故障,由于重现频率低,同时运行在服务器上,导致无法调试,此外服务直接崩溃,常规日志无法截获到有用信息,这时如果能够保留服务崩溃现场,将对后期的Bug调试起到事半功倍的效果。打印出崩溃时刻服务的堆栈信息的需求应运而生。
前提条件
编译程序服务的Debug版本,没有调试信息,神仙也没有办法。-rdynamic 为可选参数(会在打印的堆栈信息中增加调用函数名称)。
gcc: gcc -g -rdynamic main.cpp
cmake: set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -rdynamic -O0 -Wall -g")
运行结果:
trigger signal:
./test_cario(_Z14signal_handleri+0x5e) [0x400e4b]
/lib64/libc.so.(+0x35270) [0x7fc0c1e59270]
./test_cario(_Z4add2PKc+0x1f) [0x400f04]
./test_cario(_Z3addPKc+0x18) [0x400f61]
./test_cario(main+0xbc) [0x40101f]
/lib64/libc.so.(__libc_start_main+0xf5) [0x7fc0c1e45c05]
./test_cario() [0x400d29]
上面信息显示了崩溃时的调用堆栈,输出的信息只打印了调用地址,还需要对这些地址进行可视化:
[root@localhost debug]$ addr2line -e a.out 0x400e4b
/home/root/test/main.cpp:
[root@localhost debug]$ addr2line -e a.out 0x400f04
/home/root/test/main.cpp:
[root@localhost debug]$ addr2line -e a.out 0x400f61
/home/root/test/main.cpp:
[root@localhost debug]$ addr2line -e a.out 0x40101f
/home/root/test/main.cpp:
示例程序
#include <iostream>
#include <zconf.h>
#include <signal.h>
#include <execinfo.h> #include <stdio.h>
#include <stdlib.h> void signal_handler( int s ) {
fprintf( stderr, "trigger signal: %d\n", s ); void* pszstack[256] = {NULL};
int stacknum = backtrace( pszstack, 256 );
if ( stacknum > 0 ) {
char** stacktrace = backtrace_symbols( pszstack, stacknum );
for ( int i = 0; i < stacknum; ++i ) {
fprintf( stderr, "%s\n", stacktrace[i] );
}
free( stacktrace );
} else {
fprintf( stderr, "no stack trace: %d", stacknum );
}
exit(0);
} void add2( const char* psz )
{
int a = 0;
int b = 1;
std::cout << a+b << "data: " << psz[0] << std::endl;
} void add( const char* psz )
{
add2( psz );
} int main() { signal( SIGPIPE, SIG_IGN );
signal( SIGSEGV, signal_handler );
signal( SIGABRT, signal_handler );
signal( SIGFPE, signal_handler );
signal( SIGSYS, signal_handler );
signal( SIGIO, signal_handler ); char* psztemp = NULL;
for ( int i = 0; i < 5; ++i )
{
std::cout << "sleep: " << i << std::endl;
sleep( 1 );
} add(psztemp); for ( int i = 0; i < 5; ++i )
{
std::cout << "sleep2: " << i << std::endl;
sleep( 1 );
} return 0;
}
C++后台服务崩溃堆栈日志的更多相关文章
- 记在Linux上定位后台服务偶发崩溃的问题
问题描述 在最近的后台服务中,新增将某个指令的请求数据落盘保存的功能.在具体实现时,采用成员变量来保存请求消息代理头,在接收响应以及消息管理类释放时进行销毁.测试反馈,该服务偶发崩溃. 问题分析 测试 ...
- Android&iOS崩溃堆栈上报
Android&iOS崩溃堆栈上报 原文地址:http://www.cnblogs.com/songcf/p/4885468.html 通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常, ...
- golang 后台服务设计精要
原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...
- 转: iOS崩溃堆栈符号表使用与用途
转:http://bugly.qq.com/blog/?p=119 iOS崩溃堆栈符号化,定位问题分分钟搞定! 2015.3.16 腾讯Bugly 微信分享 最近一段时间,在跟开发者沟通过程中,萝 ...
- mongodb启动后台服务
将MongoDB部署在服务器机子上时mongodb的实例应为后台服务进行的方式运行,而非前台进程,否则远程会话一关闭mongodb也跟着关闭了.本文介绍mongodb后台服务进程开启和关闭的操作. 开 ...
- 【JavaService】部署Java jar为Windows后台服务
将Java jar文件部署为Windows后台服务有多种方法:Service Installer.Java service Wrapper.JavaService.exe等等.这里介绍下使用JavaS ...
- android 程序崩溃crash日志的捕捉
android 程序崩溃crash日志的捕捉 之前在项目开发过程中,一直会遇到程序崩溃了,但是测试組的哥哥们又没及时的导出日志.... 后来在诳群的时候听别人说起,腾讯有那么一个叫bugly的东西 将 ...
- .NET Core 中的通用主机和后台服务
简介 我们在做项目的时候, 往往要处理一些后台的任务. 一般是两种, 一种是不停的运行,比如消息队列的消费者.另一种是定时任务. 在.NET Framework + Windows环境里, 我们一般会 ...
- ABP后台服务之作业调度Quartz.NET
一.简介 Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活 ...
随机推荐
- Linux查看服务器硬件配置命令
一.查看服务器硬件信息 dmidecode|grep "System Information" -A9|egrep "Manufacturer|Product|Seria ...
- Learning-Python【23】:面向对象三大特性
继承 封装 多态
- sql添加一个list的查询条件
编程中往往会有需要对某个list的值进行查询的需求,而将一个list作为查询条件,我所知道的有两种方法: 1.for循环遍历,每次循环一个sql,每次查list中一个条件的数据,最后累加 ...(最基 ...
- MySQL 5.6容器使用自定义配置文件的权限问题
提出问题: 在使用Rancher2.0.2部署一个mysql deployment时,我们会发现,如果只设置/var/lib/mysql数据目录时,mysql容器(pod)能够正常启动,一旦数据目录和 ...
- R 导出pdf设置字体
主要参考自: https://blog.csdn.net/xmuecor/article/details/51462172 library(showtext)showtext.auto(enable ...
- 移动Web UI库(H5框架)
1.Framework7 Framework7 - is a free and open source mobile HTML framework to develop hybrid mobile a ...
- 清理SuperMap三维缓存
一.iclient三维插件浏览器端缓存 方法1:遍历users子文件夹,发现指定目录有supermap,即删除 @echo offtitle 清理三维缓存@echo 开始清理三维缓存...for /f ...
- Speak Confident English
I hope you don'd mind me asking... I know I shouldn't ask, but.... - Well, before I answer that ...
- Linux(CentOS 7)命令行模式安装VMware Tools 详解
本篇文章主要介绍了如何在Linux(CentOS 7)命令行模式安装VMware Tools,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. 本例中为在Linux(以CentOS 7为例)安装VM ...
- 最全面的移动APP测试点
随着互联网,大数据时代的不断推进,演化.移动开发领域得到普遍普及,APP开发如潮水般涌现.下面我将详细介绍app的测试点: 首先我们先熟悉app测试基本流程: 1.1流程图 1.2测试周期 测试周期可 ...