Можно ли использовать gdb для возврата, когда пойманы исключения?
Я только начал использовать исключения С++ и хочу, чтобы все было правильно. То, что я имею в виду, состоит в том, чтобы генерировать некоторую информацию обратной линии, когда исключены исключения. Первоначально у меня были идеи, похожие на Call-stack для исключений на С++, но в итоге выяснили, что это не совсем хорошо.
Я также прочитал Как сгенерировать stacktrace при сбое моего приложения gcc С++, но не хочу добавлять больше сложности в мой текущий проект. Поскольку в режиме отладки мне нужна только обратная трассировка, я надеялся, что с этой целью я смогу использовать gdb.
Моя стратегия заключалась в том, чтобы вставить точку останова в блок catch
, а затем перейти через стек вызовов, чтобы точно определить, почему исключение было выбрано в первую очередь (или что вызвало его)? К сожалению, я не могу это сделать, поскольку, когда gdb достигает точки останова, он очищает стек вызовов, и я могу видеть только основные (то, что я поймаю). Это должно произойти, или я делаю что-то неправильно здесь?
Edit:
Я просто хотел бы обобщить методы для других людей:
1-й метод (by paulsm4). Установите точку catch через catch throw
для ловушки при броске или catch catch
для ловушки на улове! Затем вызовите backtrace
2-й метод (с помощью ашполятора) Установите точку останова на __cxa_throw
, а затем backtrace
3-й метод (в Qt Creator - если вам посчастливилось использовать). Вы можете легко установить точку останова при броске или улове!
Edit_2: Используя отладчик Qt Creator, кажется, что установка точки останова на __cxa_begin_catch
также эквивалентна catch catch
:)
Ответы
Ответ 1
Это:
http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
Вы можете использовать точки catch, чтобы заставить отладчик остановиться на определенное время виды программных событий, таких как исключения на С++ или загрузка общая библиотека. Используйте команду catch для установки точки catch.
Таким образом, ответ должен быть "да", и он должен избегать проблем с двумя указанными вами ссылками.
Пожалуйста, отправьте сообщение, если это поможет! Лично я никогда не пробовал эту функцию GDB:)
Ответ 2
Резюме ответов из комментариев:
1-й метод (by paulsm4). Установите ловушку через catch throw
для ловушки при броске или catch catch
для ловушки на улове! Затем вызовите backtrace
2-й метод (с помощью ашполятора) Установите точку останова на __cxa_throw
, а затем backtrace
3-й метод (в Qt Creator - если вам посчастливилось использовать). Вы можете легко установить точку останова при броске или улове!
Используя отладчик Qt Creator, кажется, что установка точки останова на __cxa_begin_catch
также эквивалентна catch catch