Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?
Здравствуйте, Linuxoid, Вы писали:
L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?
ну во первых попробовать catch(std::exception& e), а во вторых скажите в какой системе разработки вы работаете
Здравствуйте, Linuxoid, Вы писали:
L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?
Если это .NET студия,
то запусти приложение в дебагере.
Затем открой диалог "Debug/Exception..."
и поставь "Break into the debugger" для C++ Exceptions.
Впрочем для других исключений можешь это тоже выставить.
Linuxoid wrote:
> Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?
Если сорс код доступен, то переносимый способ — это задефайнить throw:
В момент выдачи исключения на стандартный поток вывода будет выдано имя файла и номер строки. И позволяет обрабатывать исключения, где используются не классы, а например int-овые константы.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, MaximE, Вы писали:
ME>Если сорс код доступен, то переносимый способ — это задефайнить throw:
<skipped>
Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).
Здравствуйте, Linuxoid, Вы писали:
L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?
Из ваших постов не понятно, располагаете ли вы таки исходными текстами вашего сервиса. Если раполагаете, то хороший способ подсказал MaximE
: переопределив throw через define вы можете получить в catch информацию о месте, откуда исключение было порождено. А далее наводняете это место отладочными печатями и т.д. и т.п.
Еще один способ, если исходники доступны: отключать по очереди участки большого кода (коментируя их или через #if 0/#endif). Если у вас есть test case в котором исключение постоянно появляется, то повторяя этот test case на разных фрагментах вы найдете ситуацию, когда исключение не возникает. Далее таким же образом можно обработать найденый фрагмент и т.д.
Еще один способ, если исходники доступны: вставлять отладочную печать перед каждым throw. А затем смотреть, где чего выскочило. Если отладочные печати не удовлетворяют по соображениям скорости (был упомянут real-time), то можно поступить так: завести буфер, в который записывать какие-то метки (строки или целочисленные константы). Перед каждым throw вставить добавление в этот буфер уникальной метки (например, переопеделив throw через define). А в catch посмотреть, что за метка оказалась в буфере.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Linuxoid wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>Если сорс код доступен, то переносимый способ — это задефайнить throw: > > <skipped> > > Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).
k. wrote:
> Здравствуйте, MaximE, Вы писали: > > VC7 выдает следующее: > > d:\repository\SyncServer\Client-Side\qqq\qqq.cpp(20) : error C2512: 'std::runtime_error' : no appropriate default constructor available > > в то же время, если поправить вот так, то работает: > >
L>Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где >и почему (известен только блок кода).
определить тип исключения программно в рантайме можно только если есть предположения о его типе
тогда ставим несколько catch-ей для каждого предполагаемого базового класса исключения
Здравствуйте, MaximE, Вы писали:
ME>Linuxoid wrote:
>> Здравствуйте, MaximE, Вы писали: >> >> ME>Если сорс код доступен, то переносимый способ — это задефайнить throw: >> >> <skipped> >> >> Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).
ME>Исходники тебе доступны?
Да, доступны. Кстати, это только у меня глюк — не могу добавить в избранное твое сообщение?
[]
>>> Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода). > > ME>Исходники тебе доступны? > > Да, доступны.
Ты можешь подключить во все исходники хедер с тем кодом и перед catch(...) добавить catch(throw_site&) ?
Awaken wrote:
> > L>Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где >и почему (известен только блок кода). > > определить тип исключения программно в рантайме можно только если есть предположения о его типе > тогда ставим несколько catch-ей для каждого предполагаемого базового класса исключения
> В какой из блоков мы прилетим, и зависит ли это от порядка баз и от порядка блоков?
Сначала показалось, что это один из темных углов С++, а ответ-то простой — прилетим в в the_exception. Там ведь ищется не наиболее подходящий обработчик, а первый подходящий.