c ++ stacktrace из функции выдается исключение? - PullRequest
5 голосов
/ 08 июня 2011

Я могу использовать обратную трассировку gcc для получения трассировки стека в любой заданной точке программы, но я хотел бы получить трассировку из любого фрейма, в котором находился стек во время создания исключения, то есть доразматывание стека.

Например, следующий блок

func() {
  throw std::exception();
}

try {
  func();
}
catch ( std::exception ) {
  std::cout << print_trace();
  //do stuff
}

должен по-прежнему иметь возможность каким-то образом сохранять фрейм для функции func ().

Это было спросил раньше , но он включал необработанное исключение, которое могло бы завершить программу и, по-видимому, не давало стекам вызова возможность размотаться?

Есть ли способ сделать это, все еще будучи в состоянии перехватитьи обработать исключение нормально?

Может существовать такой подход, как использование обработчика для всех исключений, который ничего не делает, кроме как генерирует трассировку и повторно генерирует исключения.В идеале я должен иметь возможность генерировать трассировки внутри конструкторов класса Exception, но здесь я не обязательно имею контроль над исключениями, которые могут встречаться.

1 Ответ

5 голосов
/ 08 июня 2011

Возможно, вас заинтересует разрабатываемая библиотека Boost: Portable Backtrace .Пример:

#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);
    }
}

Печать:

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

Надеюсь, это поможет!

...