Boost logo

Boost :

From: Suman Cherukuri (suman_at_[hidden])
Date: 2007-04-20 13:15:35


> -----Original Message-----
> From: boost-bounces_at_[hidden] [mailto:boost-bounces_at_[hidden]]
> On Behalf Of Atry
> Sent: Friday, April 20, 2007 10:05 AM
> To: boost_at_[hidden]
> 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)


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk