Re: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 09:02
Оценка: 174 (26)
Linuxoid wrote:

> Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?


Если сорс код доступен, то переносимый способ — это задефайнить throw:

#include <cstdio>
#include <stdexcept>

struct throw_site
{
     throw_site(char const* file, int line)
         : file_(file), line_(line)
     {}

     char const* file_;
     int line_;
};

template<class exception>
struct wrapper : exception, throw_site
{
     wrapper(exception const& e, throw_site const& s)
         : exception(e), throw_site(s)
     {}
};

template<class exception>
void operator+(throw_site const& s, exception const& e)
{
     throw wrapper<exception>(e, s);
}

#define throw throw_site(__FILE__, __LINE__) +

int main()
{
     try
     {
         throw std::runtime_error("oops");
     }
     catch(std::exception& e)
     {
         if(throw_site* s = dynamic_cast<throw_site*>(&e))
         {
             fprintf(stderr, "thrown at %s:%d\n", s->file_, s->line_);
         }
     }
}


P.S. Вообще, если в твоем коде происходят ошибки и ты не можешь их локализовать, то это проблема в том что у тебе недостаточный логгинг.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[6]: Как определить причину исключения?
От: Костя Ещенко Россия  
Дата: 16.02.05 13:45
Оценка: 86 (7) +2
Кодт wrote:

> А вот такой вопрос:

>
> class the_wrapper : public the_exception, public throw_site
> {
>   ...
> };
> 
> int main()
> {
>   try
>   {
>     throw the_wrapper;
>   }
>   catch(the_exception& e)
>   {
>   }
>   catch(throw_site& s)
>   {
>   }
> }
>

> В какой из блоков мы прилетим, и зависит ли это от порядка баз и от порядка блоков?

Сначала показалось, что это один из темных углов С++, а ответ-то простой — прилетим в в the_exception. Там ведь ищется не наиболее подходящий обработчик, а первый подходящий.
Posted via RSDN NNTP Server 1.9
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[8]: Как определить причину исключения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.02.05 11:22
Оценка: +2 :)))
Здравствуйте, MaximE, Вы писали:

ME>Костя Ещенко wrote:


ME>[]


>> Сначала показалось, что это один из темных углов С++, а ответ-то простой — прилетим в в the_exception. Там ведь ищется не наиболее подходящий обработчик, а первый подходящий.


ME>Воистину так


Да, ребята... Совсем в бусте утонули
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Как определить причину исключения?
От: Кодт Россия  
Дата: 16.02.05 12:28
Оценка: 12 (2)
Здравствуйте, MaximE, Вы писали:

ME>Достаточно catch(throw_site&).


А вот такой вопрос:
class the_wrapper : public the_exception, public throw_site
{
  ...
};

int main()
{
  try
  {
    throw the_wrapper;
  }
  catch(the_exception& e)
  {
  }
  catch(throw_site& s)
  {
  }
}

В какой из блоков мы прилетим, и зависит ли это от порядка баз и от порядка блоков?
Перекуём баги на фичи!
Re[2]: Как определить причину исключения?
От: TheIrix  
Дата: 15.08.06 06:49
Оценка: 4 (1) +1
Здравствуйте, MaximE, Вы писали:

ME>Если сорс код доступен, то переносимый способ — это задефайнить throw:


Отличный способ! Но возникает одна сложность — как быть с throw в спецификациях исключений? Там он заменяется препроцессором в совершенно неудобоваримую конструкцию...
Re[3]: Как определить причину исключения?
От: remark Россия http://www.1024cores.net/
Дата: 15.08.06 12:07
Оценка: 2 (1)
Здравствуйте, TheIrix, Вы писали:

TI>Здравствуйте, MaximE, Вы писали:


ME>>Если сорс код доступен, то переносимый способ — это задефайнить throw:


TI>Отличный способ! Но возникает одна сложность — как быть с throw в спецификациях исключений? Там он заменяется препроцессором в совершенно неудобоваримую конструкцию...


+1

В большинстве мест можно спецификацию исключений закомментировать, а не ждать пока ваш любимый компилятор начнёт вызывать terminate()

А если где очень надо, то можно сделать #undef. Не очень красиво конечно, но что делать.
Можно оформить в виде:

#include "throw_off.h"

void func() throw int;

#include "throw_on.h"




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Как определить причину исключения?
От: ppp  
Дата: 16.02.05 13:57
Оценка: 1 (1)
Здравствуйте, Linuxoid, Вы писали:

L>Здравствуйте, bkat, Вы писали:


B>>Здравствуйте, Linuxoid, Вы писали:


B>>В VS 6.0 такая возможность тоже есть.


L>Этот метод подойдет для сервиса, работающего в real-time ?

bkat, прости что вмешиваюсь в вашу переписку =)
метод подойдёт. Если исключение генерится в процессе работы сервиса (при возникновении какого-то внешнего воздействия), то коннекться к процессу дебаггером и делай как bkat написал

Если исключение генерится в самом начале работы сервиса (при его загрузке), то есть два пути
1) тебе доступны исходники сервиса. Вставляешь участок кода __asm int 3 в ServiceMain
2) тебе недоступны исходники сервиса. Или идея с int 3 не нравится. Тогда открываем реестр
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\my_service.exe]
"Debugger"="D:\\dbg\\vs7jit.exe"

Естественно, в качестве поля Debugger прописываешь свой путь к нужному файлу. На это поле есть ограничение — насколько помню, длина строки не должна быть больше 24 или 26 символов. В общем, стандартный путь в папку Visual Studio не подходит. Так что копируй файлы, требуемые для дебаггера (вместе с dll) куда-нибудь в корень.
Для 6й студии дебаггер msdev.exe

Далее открываешь services.msc , находишь в нём нужный сервис, Properties, в закладке Log On выставляешь ему галочку Allow service to interact with desktop

запускаешь сервис. Дебаггер должен подцепиться к нему автоматически.

Удачи.
Если ты такой умный, почему ты такой бедный?
Как определить причину исключения?
От: Linuxoid  
Дата: 16.02.05 07:13
Оценка:
Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?
Re: Как определить причину исключения?
От: korzhik Россия  
Дата: 16.02.05 07:33
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?


ну во первых попробовать catch(std::exception& e), а во вторых скажите в какой системе разработки вы работаете
Re: Как определить причину исключения?
От: bkat  
Дата: 16.02.05 08:27
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?


Если это .NET студия,
то запусти приложение в дебагере.
Затем открой диалог "Debug/Exception..."
и поставь "Break into the debugger" для C++ Exceptions.
Впрочем для других исключений можешь это тоже выставить.

В VS 6.0 такая возможность тоже есть.

Или ты про что-то иное?
Re[2]: Как определить причину исключения?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 16.02.05 09:56
Оценка:
Круто!!!

Но, тогда, наверное, можно еще проще:

#include <iostream>

#define throw (std::cout << "throw at: " << __FILE__ << ":" << __LINE__ << std::endl),throw

const int    bad_thing = 1;

void
test()
    {
        std::cout << "test 1" << std::endl;

        throw bad_thing;

        std::cout << "test 2" << std::endl;

    }

int
main()
    {
        try
            {
                test();
            }
        catch( ... )
            {
                std::cout << "Some exception caught..." << std::endl;
            }

        return 0;
    }


В момент выдачи исключения на стандартный поток вывода будет выдано имя файла и номер строки. И позволяет обрабатывать исключения, где используются не классы, а например int-овые константы.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Как определить причину исключения?
От: Linuxoid  
Дата: 16.02.05 10:08
Оценка:
Здравствуйте, korzhik, Вы писали:

K>ну во первых попробовать catch(std::exception& e), а во вторых скажите в какой системе разработки вы работаете


Что такое "система разработки"? Если имеется в виду среда разработки, то VC++ 6.0
Re[2]: Как определить причину исключения?
От: Linuxoid  
Дата: 16.02.05 10:09
Оценка:
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, Linuxoid, Вы писали:


B>В VS 6.0 такая возможность тоже есть.


Этот метод подойдет для сервиса, работающего в real-time ?
Re[2]: Как определить причину исключения?
От: Linuxoid  
Дата: 16.02.05 10:17
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Если сорс код доступен, то переносимый способ — это задефайнить throw:


<skipped>

Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).
Re: Как определить причину исключения?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 16.02.05 10:33
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?


Из ваших постов не понятно, располагаете ли вы таки исходными текстами вашего сервиса. Если раполагаете, то хороший способ подсказал MaximE
Автор: MaximE
Дата: 16.02.05
: переопределив 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++.
Re[2]: Как определить причину исключения?
От: k. Россия  
Дата: 16.02.05 11:39
Оценка:
Здравствуйте, MaximE, Вы писали:

VC7 выдает следующее:

d:\repository\SyncServer\Client-Side\qqq\qqq.cpp(20) : error C2512: 'std::runtime_error' : no appropriate default constructor available

в то же время, если поправить вот так, то работает:

template<class T>
struct wrapper : T, throw_site
{
     wrapper(T const& e, throw_site const& s)
         : T(e), throw_site(s)
     {}
};


не подскажите в чем дело и как это со стандартом соотносится?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[3]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 11:49
Оценка:
Linuxoid wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Если сорс код доступен, то переносимый способ — это задефайнить throw:
>
> <skipped>
>
> Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).

Исходники тебе доступны?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[3]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 11:52
Оценка:
k. wrote:

> Здравствуйте, MaximE, Вы писали:

>
> VC7 выдает следующее:
>
> d:\repository\SyncServer\Client-Side\qqq\qqq.cpp(20) : error C2512: 'std::runtime_error' : no appropriate default constructor available
>
> в то же время, если поправить вот так, то работает:
>
>
> template<class T>
> struct wrapper : T, throw_site
> {
>      wrapper(T const& e, throw_site const& s)
>          : T(e), throw_site(s)
>      {}
> };
>

>
> не подскажите в чем дело и как это со стандартом соотносится?

Случаем перед этим не написано где-то using namespace std; ?

Если нет, то это, возможно, глюк студии.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: Как определить причину исключения?
От: k. Россия  
Дата: 16.02.05 11:54
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Случаем перед этим не написано где-то using namespace std; ?


нет, подобное я само собой проверил.

ME>Если нет, то это, возможно, глюк студии.


спасибо.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[3]: Как определить причину исключения?
От: Awaken Украина  
Дата: 16.02.05 11:58
Оценка:
L>Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где >и почему (известен только блок кода).

определить тип исключения программно в рантайме можно только если есть предположения о его типе
тогда ставим несколько catch-ей для каждого предполагаемого базового класса исключения

или речь не об этом?
Re[4]: Как определить причину исключения?
От: Linuxoid  
Дата: 16.02.05 12:00
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Linuxoid wrote:


>> Здравствуйте, MaximE, Вы писали:

>>
>> ME>Если сорс код доступен, то переносимый способ — это задефайнить throw:
>>
>> <skipped>
>>
>> Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).

ME>Исходники тебе доступны?


Да, доступны. Кстати, это только у меня глюк — не могу добавить в избранное твое сообщение?
Re[5]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 12:10
Оценка:
Linuxoid wrote:

[]

>>> Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).

>
> ME>Исходники тебе доступны?
>
> Да, доступны.

Ты можешь подключить во все исходники хедер с тем кодом и перед catch(...) добавить catch(throw_site&) ?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 12:11
Оценка:
Awaken wrote:

>

> L>Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где >и почему (известен только блок кода).
>
> определить тип исключения программно в рантайме можно только если есть предположения о его типе
> тогда ставим несколько catch-ей для каждого предполагаемого базового класса исключения

Достаточно catch(throw_site&).

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[6]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 12:35
Оценка:
Кодт wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Достаточно catch(throw_site&).
>
> А вот такой вопрос:
>
> class the_wrapper : public the_exception, public throw_site
> {
>   ...
> };
>
> int main()
> {
>   try
>   {
>     throw the_wrapper;
>   }
>   catch(the_exception& e)
>   {
>   }
>   catch(throw_site& s)
>   {
>   }
> }
>

> В какой из блоков мы прилетим, и зависит ли это от порядка баз и от порядка блоков?

Отличный вопрос. Чешу репу...

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[7]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 13:51
Оценка:
Костя Ещенко wrote:

[]

> Сначала показалось, что это один из темных углов С++, а ответ-то простой — прилетим в в the_exception. Там ведь ищется не наиболее подходящий обработчик, а первый подходящий.


Воистину так

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[6]: Как определить причину исключения?
От: Linuxoid  
Дата: 16.02.05 20:18
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Linuxoid wrote:


ME>[]


>>>> Может я чего-то не допонял, но каким образом мне это поможет? Я же не кидаю исключение руками, оно генерится программой неизвестно где и почему (известен только блок кода).

>>
>> ME>Исходники тебе доступны?
>>
>> Да, доступны.

ME>Ты можешь подключить во все исходники хедер с тем кодом и перед catch(...) добавить catch(throw_site&) ?


Подключил, проверил. Я же говорил что не поможет Программа проскакивает catch (exception& e) и сваливается в catch(...) Максим, мне кажется вы не совсем поняли суть проблемы. Еще раз хочу подчеркнуть, что приложение явно (т.е. с помощью throw) исключение не кидает, поэтому переопределение задачу не решает.
Re[7]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.02.05 20:55
Оценка:
Linuxoid wrote:

> Подключил, проверил. Я же говорил что не поможет Программа проскакивает catch (exception& e) и сваливается в catch(...) Максим, мне кажется вы не совсем поняли суть проблемы. Еще раз хочу подчеркнуть, что приложение явно (т.е. с помощью throw) исключение не кидает, поэтому переопределение задачу не решает.


Теперь понял.

http://rsdn.ru/Forum/Message.aspx?mid=974648
Автор: Ignoramus
Дата: 04.01.05


(Что-то подсказывает, что сервис твой виндозный, так как в Linux сигналы в catch(...) никак не попадают)

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[8]: Как определить причину исключения?
От: Linuxoid  
Дата: 16.02.05 22:07
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Теперь понял.


ME>http://rsdn.ru/Forum/Message.aspx?mid=974648
Автор: Ignoramus
Дата: 04.01.05


ME>(Что-то подсказывает, что сервис твой виндозный, так как в Linux сигналы в catch(...) никак не попадают)


Сервис действительно виндовый (под линухом такие штуки называются демонами )
Уже нашел. Сваливается на макросе BREAK() (который разворачивается в debug-версии в _asm int 3). Кстати хотелось бы узнать подробнее про int 3. Я так понимаю это отладочное прерывание, по которому должна выполняться остановка в отладчике? А почему тогда возникают такие проблемы?
Re[9]: Как определить причину исключения?
От: Demay  
Дата: 17.02.05 07:24
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Здравствуйте, MaximE, Вы писали:


ME>>Теперь понял.


ME>>http://rsdn.ru/Forum/Message.aspx?mid=974648
Автор: Ignoramus
Дата: 04.01.05


ME>>(Что-то подсказывает, что сервис твой виндозный, так как в Linux сигналы в catch(...) никак не попадают)


L>Сервис действительно виндовый (под линухом такие штуки называются демонами )

L>Уже нашел. Сваливается на макросе BREAK() (который разворачивается в debug-версии в _asm int 3). Кстати хотелось бы узнать подробнее про int 3. Я так понимаю это отладочное прерывание, по которому должна выполняться остановка в отладчике? А почему тогда возникают такие проблемы?

Ну BREAK() в исходнике поставлен для каких-то целей, например не прошла проверка и нужно попасть в отладчик, так посмотри почему твой код попадает в BREAK().
Re[9]: Как определить причину исключения?
От: Кодт Россия  
Дата: 17.02.05 10:11
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Уже нашел. Сваливается на макросе BREAK() (который разворачивается в debug-версии в _asm int 3). Кстати хотелось бы узнать подробнее про int 3. Я так понимаю это отладочное прерывание, по которому должна выполняться остановка в отладчике?


Именно так.
Дебаггер замещает код в точках остановок на инструкцию int 3. Когда вызывается обработчик, то дебаггер смотрит в свою таблицу, является ли это точкой остановки, или это авторство исходной программы.

L>А почему тогда возникают такие проблемы?


Потому что если дебаггера (и, соответственно, осмысленного обработчика) нет, то дефолтный обработчик выполняет какое-то ритуальное действие — например, raise(SIGINT) или что-нибудь в таком роде.
Перекуём баги на фичи!
Re[2]: Как определить причину исключения?
От: pigeon Великобритания
Дата: 25.03.05 13:58
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Linuxoid wrote:


>> Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?


ME>Если сорс код доступен, то переносимый способ — это задефайнить throw:


ME>
ME>#include <cstdio>
ME>#include <stdexcept>

ME>struct throw_site
ME>{
ME>     throw_site(char const* file, int line)
ME>         : file_(file), line_(line)
ME>     {}

ME>     char const* file_;
ME>     int line_;
ME>};

ME>template<class exception>
ME>struct wrapper : exception, throw_site
ME>{
ME>     wrapper(exception const& e, throw_site const& s)
ME>         : exception(e), throw_site(s)
ME>     {}
ME>};

ME>template<class exception>
ME>void operator+(throw_site const& s, exception const& e)
ME>{
ME>     throw wrapper<exception>(e, s);
ME>}

ME>#define throw throw_site(__FILE__, __LINE__) +

ME>int main()
ME>{
ME>     try
ME>     {
ME>         throw std::runtime_error("oops");
ME>     }
ME>     catch(std::exception& e)
ME>     {
ME>         if(throw_site* s = dynamic_cast<throw_site*>(&e))
ME>         {
ME>             fprintf(stderr, "thrown at %s:%d\n%s\n", s->file_, s->line_,e.what());
ME>         }
ME>     }
ME>}
ME>

Объясните плз,почему я не могу получить информацию из std::exception& e , почему выводится пустая строка,а не oops . Спасибо.

ME>--

ME>Maxim Yegorushkin
"Если вы держите слона за заднюю ногу, а он вырывается, то самое лучшее отпустить его" — Авраам Линкольн
Premature optimization is the root of all evil in programming. Donald Knuth
Re[3]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 25.03.05 14:07
Оценка:
pigeon wrote:

> Объясните плз,почему я не могу получить информацию из std::exception& e , почему выводится пустая строка,а не oops . Спасибо.


Не могу объяснить. Возможно, у тебя при компиляции отключены исключения.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: Как определить причину исключения?
От: pigeon Великобритания
Дата: 25.03.05 14:14
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>pigeon wrote:


>> Объясните плз,почему я не могу получить информацию из std::exception& e , почему выводится пустая строка,а не oops . Спасибо.


ME>Не могу объяснить. Возможно, у тебя при компиляции отключены исключения.

Да нет,не отключены — имя файла и номер строки выводит,а вот причину
ME>--
ME>Maxim Yegorushkin
"Если вы держите слона за заднюю ногу, а он вырывается, то самое лучшее отпустить его" — Авраам Линкольн
Premature optimization is the root of all evil in programming. Donald Knuth
Re[5]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 25.03.05 14:32
Оценка:
pigeon wrote:

> ME>Не могу объяснить. Возможно, у тебя при компиляции отключены исключения.

> Да нет,не отключены — имя файла и номер строки выводит,а вот причину

Посмотри в хедере, какой тип возвращаемого значения what(), вдруг он не char const*...

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[6]: Как определить причину исключения?
От: pigeon Великобритания
Дата: 25.03.05 14:52
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>pigeon wrote:


>> ME>Не могу объяснить. Возможно, у тебя при компиляции отключены исключения.

>> Да нет,не отключены — имя файла и номер строки выводит,а вот причину

ME>Посмотри в хедере, какой тип возвращаемого значения what(), вдруг он не char const*...

typedef const char *__exString;

проверил на gcc все нормально работает,может это проблема в VC++ 6 или в родном STL .
В любом случае спасибо.

ME>--

ME>Maxim Yegorushkin
"Если вы держите слона за заднюю ногу, а он вырывается, то самое лучшее отпустить его" — Авраам Линкольн
Premature optimization is the root of all evil in programming. Donald Knuth
Re: Радикальный вариант
От: remark Россия http://www.1024cores.net/
Дата: 15.08.06 12:24
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?



Радикальный вариант! Код программы не надо трогать совсем!
Если на платформе Win32... Хотя на Win32 не может работать real-time ПО... Но всё же почти real-time может. Хотя на других не совсем убогих платформах должны быть аналогичные средства... Whatever

Делаешь небольшую консольную прогу Х, которая стартует вместе с твоим сервисом.
Х подрубается как отладчик к сервису с помощью DebugActiveProcess()
Х ждёт отладочных сообщений от сервиса с помощью WaitForDebugEvent()
Х при поступлении EXCEPTION_DEBUG_EVENT при помощи библиотечки DbgHelp функцией SymFromAddr() по адресу находит имя функции, которая кинула исключение.
Х пишет время, информацию об исключении, имя функции в файлик.

Задача решена

Получается такой мини-отладчик для специфичной цели логирования исключений. Если кидается не в твоей функции, а в библиотечной, то можно какой-нибудь другой инфы нарыть вместо имени функции, хотя, например, msvcrt тоже с pdb'шкой поставляется.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Радикальный вариант
От: Centaur Россия  
Дата: 15.08.06 12:33
Оценка:
Здравствуйте, remark, Вы писали:

R>Делаешь небольшую консольную прогу Х, которая стартует вместе с твоим сервисом.

R>Х подрубается как отладчик к сервису с помощью DebugActiveProcess()

Не будет работать под ограниченным пользователем. А требовать для работы программы админских прав — дурной тон.
Re[3]: Радикальный вариант
От: remark Россия http://www.1024cores.net/
Дата: 15.08.06 13:18
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, remark, Вы писали:


R>>Делаешь небольшую консольную прогу Х, которая стартует вместе с твоим сервисом.

R>>Х подрубается как отладчик к сервису с помощью DebugActiveProcess()

C>Не будет работать под ограниченным пользователем. А требовать для работы программы админских прав — дурной тон.


А real-time сервис устанавливает и настраивает юзер?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Радикальный вариант
От: Centaur Россия  
Дата: 15.08.06 14:25
Оценка:
Здравствуйте, remark, Вы писали:

R>>>Делаешь небольшую консольную прогу Х, которая стартует вместе с твоим сервисом.

R>>>Х подрубается как отладчик к сервису с помощью DebugActiveProcess()

C>>Не будет работать под ограниченным пользователем. А требовать для работы программы админских прав — дурной тон.


R>А real-time сервис устанавливает и настраивает юзер?


В любом случае, если мы запускаем отдельный служебный процесс, то ничто нам не мешает унести в него глючный падучий код и обрабатывать уже не смертельный UB у себя в кишках, а всего лишь ненормальное завершение дочернего процесса.
Re[3]: Как определить причину исключения?
От: MaximE Великобритания  
Дата: 16.08.06 09:25
Оценка:
TheIrix wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Если сорс код доступен, то переносимый способ — это задефайнить throw:
>
> Отличный способ! Но возникает одна сложность — как быть с throw в
> спецификациях исключений? Там он заменяется препроцессором в совершенно
> неудобоваримую конструкцию...

Согласен, способ не без изъяна.

catch(...) { throw; }


Также не будет компилироваться.

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re: Как определить причину исключения?
От: davenger  
Дата: 16.08.06 09:49
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Есть блок кода, в котором возникает исключение (довольно большой). Блок защищен оператором try, исключение перехватывается в catch(...) (других catch нет). Неизвестно что вызывает исключение и в каком конкретно месте оно возникает. Как получить более подробную информацию и локализовать проблемное место?


Раз уж поднялась эта тема, то вот интересная ссылка про то как можно в дебагере под виндой опредедить колстэк на момент исключения.
Re[4]: Как определить причину исключения?
От: TheIrix  
Дата: 16.08.06 12:26
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Согласен, способ не без изъяна.


ME>
ME>catch(...) { throw; }
ME>


ME>Также не будет компилироваться.


Увы, да... Спецификации исключений встречаются только в библиотечном коде (stl, boost), и можно (как показано выше) раздефайнить throw.
А вот "throw;"... Даже не знаю, можно ли написать корректный по отношению к этим случаям макрос...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.