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

[]

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


Воистину так

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
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

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

Удачи.
Если ты такой умный, почему ты такой бедный?
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[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[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[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: Радикальный вариант
От: 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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.