boost stacktrace堆栈打印

在windows下最方便的是minidump,其他2个平台麻烦不少,google-breakpad使用起来又太麻烦.

最近boost1.65版本出了个stacktrace使用起来简单方便,只是无法看实际数据,对于快速定位BUG还是很有帮助的.

要注意的是异常的处理需要写文件,应用重启之后再读取查看~  用其他应用读取或者修改应用之后读取都会无法正确显示!!!

复制代码

 1 #pragma once
 2 //异常生成dump时立刻查看会死锁,只能重启应用后才能查看
 3 
 4 #ifndef BOOST_ENABLE_ASSERT_DEBUG_HANDLER
 5 #define BOOST_ENABLE_ASSERT_DEBUG_HANDLER
 6 #endif
 7 
 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, ::raise
 5 #include <strstream>
 6 #include <stdexcept>    // std::logic_error
 7 #include <iostream>     // std::cerr
 8 #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

复制代码

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C中的stacktrace是指在程序运行过程中,记录函数调用关系和执行位置的一种机制。当程序发生错误或异常情况时,可以通过stacktrace来定位问题发生的位置,帮助开发人员进行调试和错误修复。 在C语言中,stacktrace可以通过获取函数调用栈来实现。函数调用栈是一个存储函数调用关系和局部变量的数据结构,栈顶表示当前正在执行的函数。可以通过以下几种方法来获取C的stacktrace: 1. 使用调试工具:在开发环境中,可以使用调试工具(如GDB)来获取stacktrace。通过设置断点或捕捉异常,可以在程序执行过程中暂停并查看函数调用栈的信息。 2. 异常处理:在代码中可以使用异常处理机制来捕获异常,并将stacktrace作为异常信息输出。可以使用`backtrace`和`backtrace_symbols`等函数获取函数调用栈的信息,并将其打印出来。 3. 自定义实现:也可以自己编写代码来实现获取stacktrace的功能。使用函数指针的方式,将每个函数的调用关系保存在一个自定义的数据结构中,并在需要时打印出来。 无论使用哪种方法,获取stacktrace可以帮助开发人员更快地定位问题发生的位置,从而快速解决bug。在生产环境中,由于性能和安全等方面的考虑,通常需要做一些限制,避免泄露敏感信息。因此,在实际应用中需要根据具体需求来选择合适的方法来获取stacktrace

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值