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应用中.它提供了巨大的灵活 ...
随机推荐
- ipconfig/release时:系统找不到指定的文件。无法连接网络
问题描述: ipconfig/release时:系统找不到指定的文件,无法连接网络,无法获取正确ip地址 处理方法: 修复Winsock和重置IP设置.第一步:开始-运行,输入cmd,打开命令行窗口. ...
- CSDN不登录阅读全文(最新更新
CSDN真的烦...然而没卵用 用stylus加两行css就行了: .article_content{height:auto!important} .hide-article-box{display: ...
- Windows下nginx+tomcat实现简单的负载均衡
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请 ...
- TASE2017
PATTERN系列之五 I. Introduction To ease the expression of real-time requirements, Dwyer, and then Konrad ...
- Django 修改视图文件(views.py)并加载Django模块 + 利用render_to_response()简化加载模块 +locals()
修改视图代码,让它使用 Django 模板加载功能而不是对模板路径硬编码.返回 current_datetime 视图,进行如下修改: from django.template.loader impo ...
- Go语言开发Prometheus Exporter示例
一.Prometheus中的基本概念 Prometheus将所有数据存储为时间序列,这里先来了解一下prometheus中的一些基本概念 指标名和标签每个时间序列都由指标名和一组键值对(也称为标签)唯 ...
- QGis+QT5.9+VS2017源码编译
1.需要软件 VS2017 QT5.9.2 CMake 3.10.2 Cygwin osgeo4w QGIS源码 2.安装VS2017 过程省略 是由于机器上已经安装了VS2017 3.安装QT5. ...
- kibana升级之后原本保存的数据dashboards, visualizations, index patterns丢失
1,es升级注意的问题:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/rolling-upgrades.html 2,kiba ...
- conda基本操作
准备环境 # 下载并安装conda基础环境 $ wget https://mirror.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-4.3.1 ...
- 牛客练习赛42 C 出题的诀窍
题目链接:https://ac.nowcoder.com/acm/contest/393/C 这个题就是对于每个数算贡献,如果有相同的数,只计算先出现的数的贡献 对于数x,若它在前i行的数目分别为a1 ...