
-----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] On Behalf Of Atry Sent: Friday, April 20, 2007 10:05 AM To: boost@lists.boost.org Subject: [boost] Any interest for stack_trace?
Java programs are easy to debug, one who catch an exception can print the stack trace, and when it crash, it would print the stack, too. It is useful, so I wrote some code of stack_trace for C++, see the sample below:
Yes, I like it. It'd be very useful
/***** sample.cpp *****/ #include <boost/stack_trace.hpp> #include <iostream> #include <sstream> using namespace boost; using namespace std;
class exception_with_stack_trace : public exception { private: std::string what_; public: exception_with_stack_trace(const char* file, unsigned int line, const char* func) { stringstream ss; ss << "exception occurred at " << func << " (" << file << ":" << line << ")\n"; vector<stack_trace::element const *> const & st = stack_trace::get(); for(size_t i = st.size(); --i != 0; ) { ss << "\tfrom " << st[i]->tag() << " (" << st[i]->file() << ":" << st[i]->line() << ")\n"; } what_ = ss.str(); } virtual exception_with_stack_trace::~exception_with_stack_trace() throw (){} virtual const char * what() const throw () { return what_.c_str(); } };
void foo(int a) { BOOST_STACK_TRACK_CALL; cout << stack_trace::to_string() << endl; if(a == 1) { throw exception_with_stack_trace(__FILE__, __LINE__, __FUNCTION__); }
} void foo() { BOOST_STACK_TRACK_CALL; foo(0); foo(1); cout << stack_trace::to_string() << endl; } void bar() { BOOST_STACK_TRACK_CALL; foo(); cout << stack_trace::to_string() << endl; }
int main() { BOOST_STACK_TRACK_CALL; try { BOOST_STACK_TRACK_TAG("try"); foo(); cout << stack_trace::to_string() << endl; bar(); cout << stack_trace::to_string() << endl; } catch(exception& e) { cerr << e.what() << endl; } } /***** sample.cpp *****/
And run it to print below:
1> stdout sample.cpp 54 main sample.cpp 57 try sample.cpp 41 foo sample.cpp 32 foo
sample.cpp 54 main sample.cpp 57 try sample.cpp 41 foo sample.cpp 32 foo
2> stderr exception occurred at foo (sample.cpp:36) from foo (sample.cpp:32) from foo (sample.cpp:41) from try (sample.cpp:57)