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应用中.它提供了巨大的灵活 ...
随机推荐
- 1、Storm集群安装
1.下载 本次选择1.2.2版本进行安装 解压安装到/opt/app目录下 2.配置环境变量 export STORM_HOME=/opt/app/apache-storm-1.2.2 export ...
- 扩容 swap 分区
扩容 swap 分区 题:添加一个 swap 分区在您的系统中添加一个大小为 512 MiB 的 swap 分区.当您的系统启动时,swap 分区应 该可以自动挂载.不要移除或者修改其他已经存在于您的 ...
- Linux 进程后台运行
Linux 进程后台运行 1.进程在当前终端后台运行.(关闭终端后进程自动退出) sh test.sh & 注:运行进程后跟 “&” 2.进程长期后台运行不受终端关闭影响. nohup ...
- _pet
可以控制各职业召唤物的属性.用于增强BB `comment` 备注 `classIndex` 职业序号 `DmgAddPct` 宠物伤害倍率 `SpAddPct` 法术伤害 `HpAddPct`血量倍 ...
- 自己封装myLocalStorage,使其有有效期
项目中遇见 cookie 值存不上,what fuck?什么情况,不知道.用$.cookie 和原生的 cookie 都不行,存上值,就被删了一样.找不见地方.考虑到项目比较大,去找得代价,还不如换种 ...
- JxBrowser之三:常用函数setNetworkDelegate
1.常用函数setNetworkDelegate,包含对网络传输数据状态的多种监控回调. 2.着重说一下其中的几个函数 BrowserContext browserContext = BrowserC ...
- gevent-协程用法
文章介绍了一种采用循环的方式生产协程列表,并可以向协程函数传递参数... # 协程引用import gevent from gevent import monkey, pool monkey.patc ...
- Python里面的write()方法写入文件时候的乱码解决方法
为了为今后的大数据以及人工智能的大潮流的到来做准备,最近在学Python,在这个过程中,会遇到许多汉字之间的转换,今天在写write方法的时候,发现写入的汉字会出现乱码,百思不得其解,上网查众资料,, ...
- CentOS7.5下安装Python3.7 --python3
1.将本地安装包上传到远程主机上 scp Python-3.7.0.tgz root@123.206.74.24:/root 2.扩展 安装Python之前安装Python相关的依赖包(主要是u红色部 ...
- ThinkPHP5.0完全开发手册 --技术文档
1.ThinkPHP5.0完全开发手册.chm 链接:https://pan.baidu.com/s/1199wK6q6O9IyOf5RU_-Xow 提取码:hnek 2.ThinkPHP5.0完全开 ...