boost stacktrace堆栈打印
在windows下最方便的是minidump,其他2个平台麻烦不少,google-breakpad使用起来又太麻烦.
最近boost1.65版本出了个stacktrace使用起来简单方便,只是无法看实际数据,对于快速定位BUG还是很有帮助的.
要注意的是异常的处理需要写文件,应用重启之后再读取查看~ 用其他应用读取或者修改应用之后读取都会无法正确显示!!!
1 #pragma once2 //异常生成dump时立刻查看会死锁,只能重启应用后才能查看3 4 #ifndef BOOST_ENABLE_ASSERT_DEBUG_HANDLER5 #define BOOST_ENABLE_ASSERT_DEBUG_HANDLER6 #endif7 8 #include <string>9 #include <boost/noncopyable.hpp> 10 #include <boost/function.hpp> 11 #include <boost/stacktrace.hpp> 12 13 class plugin_dump : 14 private boost::noncopyable 15 { 16 public: 17 plugin_dump(); 18 ~plugin_dump(); 19 20 //显示dump信息回调 21 typedef boost::function1<void, const boost::stacktrace::stacktrace&> ON_DUMP; 22 23 void set_handler(ON_DUMP _handler); 24 25 static std::string gen_filename(); 26 private: 27 void show_last_dump(); 28 ON_DUMP m_handler; 29 };
1 #include "stdafx.h"2 #include "plugin_dump.h"3 4 #include <signal.h> // ::signal, ::raise5 #include <strstream>6 #include <stdexcept> // std::logic_error7 #include <iostream> // std::cerr8 #include <boost/filesystem.hpp>9 #include <enable_process_info.hpp> 10 11 void g_signal_handler(int signum) { 12 ::signal(signum, SIG_DFL); 13 std::string filename = plugin_dump::gen_filename(); 14 if (boost::filesystem::exists(filename.c_str())) 15 boost::filesystem::remove(filename.c_str()); 16 boost::stacktrace::safe_dump_to(3, boost::stacktrace::detail::max_frames_dump, filename.c_str()); 17 ::raise(SIGABRT); 18 } 19 20 plugin_dump::plugin_dump() 21 { 22 ::signal(SIGSEGV, &g_signal_handler); 23 ::signal(SIGABRT, &g_signal_handler); 24 if (!boost::filesystem::exists("./dumps")) 25 boost::filesystem::create_directory("./dumps"); 26 } 27 28 plugin_dump::~plugin_dump() 29 { 30 31 } 32 33 void plugin_dump::set_handler(ON_DUMP _handler) 34 { 35 m_handler = _handler; 36 show_last_dump(); 37 } 38 39 void plugin_dump::show_last_dump() 40 { 41 std::string filename = plugin_dump::gen_filename(); 42 if (boost::filesystem::exists(filename.c_str())) { 43 44 std::ifstream ifs(filename.c_str()); 45 boost::stacktrace::stacktrace st = boost::stacktrace::stacktrace::from_dump(ifs); 46 47 if (!m_handler.empty()) 48 m_handler(st); 49 else 50 std::cout << st; 51 52 ifs.close(); 53 std::getchar(); 54 } 55 } 56 57 std::string plugin_dump::gen_filename() 58 { 59 std::string file = "./dumps/" + enable_process_info::get_processname() + ".dump"; 60 return file; 61 } 62 63 // 64 // BOOST_ENABLE_ASSERT_DEBUG_HANDLER is defined for the whole project 65 namespace boost { 66 inline void assertion_failed_msg(char const* expr, char const* msg, char const* function, char const* /*file*/, long /*line*/) { 67 std::cerr << "Expression '" << expr << "' is false in function '" << function << "': " << (msg ? msg : "<...>") << ".\n" 68 << "Backtrace:\n" << boost::stacktrace::stacktrace() << '\n'; 69 std::abort(); 70 } 71 72 inline void assertion_failed(char const* expr, char const* function, char const* file, long line) { 73 ::boost::assertion_failed_msg(expr, 0 /*nullptr*/, function, file, line); 74 } 75 } // namespace boost
boost stacktrace堆栈打印相关推荐
- boost::stacktrace::detail::void_ptr_cast相关的测试程序
boost::stacktrace::detail::void_ptr_cast相关的测试程序 实现功能 C++实现代码 实现功能 boost::stacktrace::detail::void_pt ...
- boost::stacktrace模块实现终止处理程序的测试程序
boost::stacktrace模块实现终止处理程序的测试程序 实现功能 C++实现代码 实现功能 boost::stacktrace模块实现终止处理程序的测试程序 C++实现代码 #include ...
- boost::filesystem模块打印文件状态的测试程序
boost::filesystem模块打印文件状态的测试程序 实现功能 C++实现代码 实现功能 boost::filesystem模块打印文件状态的测试程序 C++实现代码 #include < ...
- boost::filesystem模块打印文件的大小的测试程序
boost::filesystem模块打印文件的大小的测试程序 实现功能 C++实现代码 实现功能 boost::filesystem模块打印文件的大小的测试程序 C++实现代码 #include & ...
- boost::posix_time模块打印当天的剩余小时数的测试程序
boost::posix_time模块打印当天的剩余小时数的测试程序 实现功能 C++实现代码 实现功能 boost::posix_time模块打印当天的剩余小时数的测试程序 C++实现代码 #inc ...
- boost::stacktrace::detail相关的测试程序
boost::stacktrace::detail相关的测试程序 实现功能 C++实现代码 实现功能 boost::stacktrace::detail相关的测试程序 C++实现代码 #include ...
- boost::stacktrace::stacktrace相关的测试程序
boost::stacktrace::stacktrace相关的测试程序 实现功能 C++实现代码 实现功能 boost::stacktrace::stacktrace相关的测试程序 C++实现代码 ...
- Android hal 层 C 堆栈打印方法
Android hal 层 C 堆栈打印方法 一.添加CallStack文件 在hardware/qcom/audio/hal/ 下添加 callstack.cpp 和 callstack.h文件 # ...
- boost::stacktrace模块入门调试功能相关的测试程序
boost::stacktrace模块入门调试功能相关的测试程序 实现功能 C++实现代码 实现功能 boost::stacktrace模块入门调试功能相关的测试程序 C++实现代码 #include ...
最新文章
- 你不知道的z-index
- 《HTML5移动应用开发入门经典》—— 1.1 了解HTML5的由来
- mysql 变量作用_MySQL变量的用法
- java 队列复制_java - 复制堆栈或队列,而无需使用“克隆” - 堆栈内存溢出
- 页面中用到iframe不能完全显示的解决方案
- php如何操作mysql数据库代码_php如何操作mysql数据库的类(附代码)
- 中countif函数_Count系列函数-Count、Counta、Countblank、Countif、Countifs
- ss模型复模态的物理意义及adams复模态振型求解
- 【教程】从人脸检测与比对,实测七牛云人脸核验 API
- JAVA冰箱评测开题报告,家用冰箱毕业论文 开题报告
- 数据结构1800题-错题集-第六章
- Attention机制--concat方式
- 华为手机备份的通讯录是什么文件_华为手机怎样备份手机通讯录(教你微信如何备份手机通讯...
- 如何在电脑上下载node.js并启动相应网易云服务器最全【该服务器见尚硅谷2021版微信小程序开发p20】
- 监控摄像头角度范围计算方法
- 微信公众号音乐html,如何在微信公众号文章内插入音频及样式?
- linux原生桌面,亲手打造自己的Linux桌面环境
- 根据银行卡号来获取银行名称-java
- Android中Notification的使用(一)
- wex5 教程之 图文讲解 Cloudx5一键部署
热门文章
- JAVA入门级教学之(super关键字)
- java 递归_采用递归算法求解迷宫问题(Java版) | 附代码+视频
- js br不生效_前端标注工具-AILabel.js
- 计算机科学美国大学专业,2018美国大学计算机科学专业大排名
- php 时间格式化_3分钟短文 | PHP获取函数的代码片段,唯有反射最高效
- 为什么要学习Java EE?需要掌握哪些技能?
- vector父类类型可以存放子类吗_拼夕夕三轮面经:被问到反射和泛型的bug,你踏空了吗?...
- python 安卓app开发环境搭建_基于react-native的APP开发环境配置
- 操作系统中的全局页面置换算法
- 是vans_Vans 的旧海报上原来有这么多学问…