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

复制代码

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis优秀文章

https://www.cnblogs.com/PatrickLiu/tag/Redis/

Countries

描述 There are two antagonistic countries, country A and country B. They are in a war, and keep launching missiles towards each other. It is known that country A will launch N missiles. The i-th missile will be launched at time Tai. It flies uniformly and …

Windows下dump文件生成与分析

一、 生成Dump文件方式 1.1任务管理器 在程序崩溃后&#xff0c;先不关闭程序&#xff0c;在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出&#xff0c;此种方法只适用于程序崩溃但没有立即自行退出的情…

HTTP与HTTPS的区别[转载]

优秀文章链接&#xff1a;https://www.cnblogs.com/wqhwe/p/5407468.html

迪杰斯特拉算法 两点间最短路径的选择

百度首页 登录 注册 新闻网页贴吧知道音乐图片视频地图百科文库进入词条搜索词条帮助首页分类艺术科学自然文化地理生活社会人物经济体育历史特色百科历史上的今天数字博物馆史记2015城市百科二战百科非遗百科用户蝌蚪团燃梦计划百科任务百科商城权威合作合作模式常见问题联系方…

TLS--线程局部存储

转自&#xff1a;https://blog.csdn.net/u013761036/article/details/54960277 这个东西并不陌生了&#xff0c;之前写过了一个关于这个的应用&#xff0c;利用静态TLS姿势实现代码段静态加密免杀或者所谓的加壳思路。地址在这:http://blog.csdn.net/u013761036/article/detai…

小白科普:Netty有什么用?【转载】

优秀文章链接&#xff1a;https://blog.csdn.net/bjweimengshu/article/details/78786315#commentBox

TLS线程局部存储--thread_specific_ptr

大多数函数都不是可重入的。这也就是说在某一个线程已经调用了一个函数时&#xff0c;如果你再调用同一个函数&#xff0c;那么这样是不安全的。一个不可重入的函数通过连续的调用来保存静态变量或者是返回一个指向静态数据的指针。 举例来说&#xff0c;std::strtok就是不可重…

icpc青岛栈

1001-I Count Two Three 题意&#xff1a;给出一个整数n, 找出一个大于等于n的最小整数m, 使得m可以表示为2a3b5c7d。 分析&#xff1a;很好想&#xff0c;因为数据是在1~1e9之间的&#xff0c;所以直接将所有2a3b5c7d的形式且小于1e9的数字打表&#xff0c;然后二分搜索出大于…

互斥锁和条件变量

转自&#xff1a;https://www.jb51.net/article/102764.htm mutex体现的是一种竞争&#xff0c;我离开了&#xff0c;通知你进来。 cond体现的是一种协作&#xff0c;我准备好了&#xff0c;通知你开始吧。 互斥锁一个明显的缺点是它只有两种状态&#xff1a;锁定和非锁定。…

jetty优秀文章转载

地址&#xff1a;https://www.cnblogs.com/yiwangzhibujian/p/5845623.html

UNet详解(转)

Unity Networking&#xff08;UNet&#xff09;函数时序统计和分析 背景和概述 Unity Networking是官方自Unity5.1以来推出的新网络通信解决方案。UNet是非官方但更民间更精简的叫法。 本文需要读者有基础的UNet知识。 了解UNet时序&#xff0c;可以更好更严谨地编写UNet相…

GET和POST两种基本请求方法的区别

转载地址:https://www.cnblogs.com/logsharing/p/8448446.html GET和POST是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中&#xff0c;POST通过request body传递参数。 你可能自己写过…

icpc大连栈

赛时只出了两题 09 10 06卡死了。很烂&#xff0c;没有及时弃疗06&#xff0c;最后得不偿失 丢人。 1001 Different Circle Permutation&#xff08;矩快polya欧拉函数&#xff09; 题目大意&#xff1a;n个座位围成一圈&#xff0c;n个人中挑出若干个人坐下&#xff0c;要求…

Ubuntu14.04 VSCode工程在root下无运行,在非root无法修改配置文件

转自:https://blog.csdn.net/wenyun_kang/article/details/69389784 vscode的配置文件被加上了root权限 把配置文件的root权限去掉就好了 cd ~/.config sudo rm -rf ./Code/ 然后输入密码就好了 猜测原因:vscode在打开的时候需要改动一些配置文件,但是启动的时候发现文件…

jetty优秀文章

地址&#xff1a;http://hbiao68.iteye.com/category/291430

Ubuntu14.04 Apollo 3.5安装

一.安装git lfs 1. 安装crul &#xff1a; curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash 2. 安装 git-lfs&#xff1a; sudo apt-get --yes --force-yes install git-lfs 确保git-lfs正确安装 &#xff1a;git lfs ins…

查询数据库每天更新的数量

select LEFT(FROM_UNIXTIME(pdate),10),count(LEFT(FROM_UNIXTIME(pdate),10)) from tablename where pdate > 1536944461 and pdate < 1539593178 GROUP BY LEFT(FROM_UNIXTIME(pdate),10)

职场那些事

转自&#xff1a;https://www.zhihu.com/question/49209215 1.没有时间观念 任何集体环境中&#xff0c;没有时间观念都是大忌。尤其在职场团队协作过程中&#xff0c;每个人都有自己的位置&#xff0c;每个人的时间都是宝贵的。工作是环环相扣的&#xff0c;因为你的延期导…

顺序表应用4-2:元素位置互换之逆置算法(数据改进)

Problem Description 一个长度为len(1<len<1000000)的顺序表&#xff0c;数据元素的类型为整型&#xff0c;将该表分成两半&#xff0c;前一半有m个元素&#xff0c;后一半有len-m个元素&#xff08;1<m<len)&#xff0c;设计一个时间复杂度为O(N)、空间复杂度为O(…