在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