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: 11 ./test_cario(_Z14signal_handleri+0x5e) [0x400e4b] /lib64/libc.so.6(+0x35270) [0x7fc0c1e59270] ./test_cario(_Z4add2PKc+0x1f) [0x400f04] ./test_cario(_Z3addPKc+0x18) [0x400f61] ./test_cario(main+0xbc) [0x40101f] /lib64/libc.so.6(__libc_start_main+0xf5) [0x7fc0c1e45c05] ./test_cario() [0x400d29]
上面信息显示了崩溃时的调用堆栈,输出的信息只打印了调用地址,还需要对这些地址进行可视化:
[root@localhost debug]$ addr2line -e a.out 0x400e4b /home/root/test/main.cpp:13 [root@localhost debug]$ addr2line -e a.out 0x400f04 /home/root/test/main.cpp:30 [root@localhost debug]$ addr2line -e a.out 0x400f61 /home/root/test/main.cpp:36 [root@localhost debug]$ addr2line -e a.out 0x40101f /home/root/test/main.cpp:56
示例程序
#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;
}
转载于:https://www.cnblogs.com/wanghaiyang1930/p/8884848.html
C++后台服务崩溃堆栈日志相关推荐
- ios崩溃日志收集_iOS崩溃与日志分析
在iOS开发中经常需要靠记录日志来调试应用程序.解决崩溃问题等,整理常用的日志输出和崩溃日志分析. 最新更新:2018-11-30 基于CocoaLumberjack 的 Swift使用封装库 一.崩 ...
- # iOS进阶 # 崩溃与日志分析
看什么看!点我呀! 全栈程序员,免费入门到精通! 作者丨就叫yang https://www.jianshu.com/p/5b132f0e31a3 在iOS开发中经常需要靠记录日志来调试应用程序.解决 ...
- 后台服务架构高性能设计之道
"N 高 N 可",高性能.高并发.高可用.高可靠.可扩展.可维护.可用性等是后台开发耳熟能详的词了,它们中有些词在大部分情况下表达相近意思.本序列文章旨在探讨和总结后台架构设计中 ...
- Unity移动应用如何在Bugly上查看崩溃堆栈
文章目录 一.使用Bugly对移动应用进行崩溃监控 二.崩溃类型 1.Java崩溃 2.Native崩溃 三.Bugly上传符号表解析崩溃堆栈 1.关于符号表 2.上传符号表 3.Native崩溃堆栈 ...
- 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(二)后台服务代码部分
程序写太长了,大家看着也累,我也写着也很辛苦,接下来,还是写得简短一些,尽量多一些截图,少一些文字吧. 同样是,欢迎指点批评的同学,我虚心学习提高,改改以往的高姿态. 架设软件系统就像大家看饭店厨师炒 ...
- 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(二)后台服务代码部分...
程序写太长了,大家看着也累,我也写着也很辛苦,接下来,还是写得简短一些,尽量多一些截图,少一些文字吧. 同样是,欢迎指点批评的同学,我虚心学习提高,改改以往的高姿态. 架设软件系统就像大家看饭店厨师炒 ...
- android 发送前台广播,使用IntentService与BroadcastReceiver实现后台服务(Android7.0可用)...
IntentService的优点 IntentService会创建单独的线程处理所有的Intent请求, 会处理onHandleIntent方法实现的代码, 隐藏开发者无须处理多线程问题, 当所有请求 ...
- 【JavaService】部署Java jar为Windows后台服务
将Java jar文件部署为Windows后台服务有多种方法:Service Installer.Java service Wrapper.JavaService.exe等等.这里介绍下使用JavaS ...
- C#实现Windows后台服务实例浅析
2019独角兽企业重金招聘Python工程师标准>>> C#实现Windows后台服务实例之前要明白的一些概念:所谓Windows后台服务,即后台自动运行的程序,一般随操作系统启动而 ...
最新文章
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
- 台式计算机的cpu设置,i7型CPU进行了修改并在台式计算机上使用,这才是真正的计算机之神!...
- 如何分析案件的性质_刑事案件的管辖地怎么确定?刑事案件地域管辖是怎样的?...
- android点滴(25)之 original-package
- Linux从零开始(一、安装系统)
- 借助Redis完成延时任务
- 7-168 币值转换 (20 分)
- 关于软件系统维护的一点想法
- python使用HDF文件格式,保存多个类型的数据到一个文件
- 百度DOC php,PHP对接百度文档服务DOC
- 64位Linux下安装iNode客户端
- pyLDA系列︱考量时间因素的动态主题模型(Dynamic Topic Models)
- ant design vue折叠面板自定义header
- 最详细的 tf.cholesky_solve(chol, rhs, name=None)函数和tf.matrix_solve(matrix, rhs, adjoint=None, name=None)
- 破解 zip 压缩包程序
- 9.9 优美三角剖分 2718
- 基于PLC的矿泉水自动瓶装控制系统设计
- MAC 安装PS 破解
- Java中InputStream装饰器模式的大家族
- 【Android自动化】AccessibilityService实战-微信僵尸好友检测