Можно ли использовать gdb для обратной трассировки при обнаружении исключений?

Я только начал использовать исключения 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:)

19
задан Community 23 May 2017 в 12:34
поделиться