Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the backtrace from the catch block

I am using backtrace to get the information from where the exception is thrown. In the constructor of my exception, I am storing the backtrace in a std::string, and in the catch block for exceptions of this type, I am printing this backtrace.

But I was wondering, is it possible to somehow get the same backtrace in the catch block for other exception types?

like image 782
BЈовић Avatar asked Nov 26 '10 09:11

BЈовић


3 Answers

You might be interested in a Boost library under development: Portable Backtrace. Example:

#include <boost/backtrace.hpp>
#include <iostream>

int foo()
{
    throw boost::runtime_error("My Error");
    return 10;
}

int bar()
{
    return foo()+20;
}


int main()
{
    try {
        std::cout << bar() << std::endl;
    }
    catch(std::exception const &e)
    {
        std::cerr << e.what() << std::endl;
        std::cerr << boost::trace(e);
    }
}

Prints:

My Error
0x403fe1: boost::stack_trace::trace(void**, int) + 0x1b in ./test_backtrace
0x405451: boost::backtrace::backtrace(unsigned long) + 0x65 in ./test_backtrace
0x4054d2: boost::runtime_error::runtime_error(std::string const&) + 0x32 in ./test_backtrace
0x40417e: foo() + 0x44 in ./test_backtrace
0x40425c: bar() + 0x9 in ./test_backtrace
0x404271: main + 0x10 in ./test_backtrace
0x7fd612ecd1a6: __libc_start_main + 0xe6 in /lib/libc.so.6
0x403b39: __gxx_personality_v0 + 0x99 in ./test_backtrace

Hope this helps!

like image 180
Daniel Lidström Avatar answered Oct 17 '22 05:10

Daniel Lidström


I don't think so. When executons stops in catch block the stack is unwound, and all that has happened before is not in stack anymore.

like image 44
Dialecticus Avatar answered Oct 17 '22 06:10

Dialecticus


Do the classes in question share a common base you can edit?

Otherwise, I provided a wonderful but terribly underappreciated answer at How can some code be run each time an exception is thrown in a Visual C++ program? ;-P Some others opined too.

like image 38
Tony Delroy Avatar answered Oct 17 '22 07:10

Tony Delroy