LINUX.ORG.RU

[c++] кто последний ловит exception?

 ,


0

1

Добрый день!
Есть проект с внешней либой (исходники либы есть). Либа кидает исключение, но где-то оно перехватывается и не доходит до верха.
Данное исключение может вылелеть из многоих метс. Кто его кидает можно посмотреть по стеку вызовов. А как посмотреть кто его закрывает?
Если поставить брекпоинт в деструктор, то он вызывается сразу же после конструктора.
Как узнать, кто его обрабатывает и убивает до меня?
Проект большой и ставить брекпоинты во все catch почти нереально.

Проект большой и ставить брекпоинты во все catch почти нереально.

брекпоинт на кидок именно этого исключения, после остановки - брекпоинт на catch

vaino
()

В gdb ставь бряк на __cxa_begin_catch() и смотри backtrace.

sjinks ★★★
()

Пользователь ))

anonymous
()

Есть один приём, который через задницу, но зато не зависит от компилятора.

Внутри класса исключений делается указатель на объект с подсчётом ссылок. В принципе достаточно просто unsigned int *.

При создании исключения объект создаётся при помощи new unsigned int(1), при копировании число в счётчике увеличивается на 1, при удалении уменьшается на 1 и если равен нулю, то объект удаляется (совершенно стандартная схема).

При раскручивании стека объекты исключений копируются (даже если исключение ловится по ссылке), поэтому это позволяет ловить момент смерти последнего объекта исключения (т.е. когда исключение «замяли»).

Если кажется, что это пустое потребление ресурсов, то всю это свистопляску можно окружить #if !defined(NDEBUG).

Единственный случай, когда это не сработает --- когда исключение генерируется и ловится по указателю *косой взгляд на MFC*.

ssvda
()
19 июня 2012 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.