Я только начал использовать исключения C++ и хочу сделать это правильно. Что я имею в виду, так это генерировать какую-то информацию о трассировке при обнаружении исключений. Первоначально у меня были идеи, похожие на Стек вызовов для исключений в C++, но в конце концов я понял, что это не совсем хорошо.
Я также прочитал Как генерировать трассировку стека при сбое моего приложения gcc C++, но не хочу усложнять свой текущий проект.Поскольку мне нужна обратная трассировка только в режиме отладки, я надеялся, что смогу использовать gdb для этой цели.
Моя стратегия заключалась в том, чтобы вставить точку останова в блок catch
, а затем пройтись по стеку вызовов, чтобы точно определить, почему в первую очередь возникло исключение (или что его вызвало)? К сожалению, я не могу этого сделать, поскольку, когда gdb достигает точки останова, он очищает стек вызовов, и я могу видеть только main (вот где я ловлю). Так и должно быть или я что-то не так делаю?
Редактировать: Мне просто нравится обобщать методы здесь для других людей:
1-й метод (автор paulsm4). Установите точку захвата с помощью catch throw
для ловли при броске или catch catch
для ловли при захвате! Затем вызовите backtrace
2-й метод (от aschepler) Установите точку останова на __cxa_throw
, а затем backtrace
3-й метод (в Qt Creator — если вы используете) может легко установить точку останова на броске или ловле!
Edit_2:Используя отладчик Qt Creator, кажется, что установка точки останова на __cxa_begin_catch
также эквивалентна catch catch
:)