откуда выскакивает исключение?
От: gazizik  
Дата: 23.07.08 15:52
Оценка:
Доброго всем времени суток.
Ситуация такова: есть сервис, написанный на C++, он использует пару библиотек (тоже на С++).
И там, и там во всех возможных и невозможных местах стоят перехватчики. Однако же! Редко но метко прорывается исключение, которое просто роняет сервис.
При этом окно об ошибке не выскакивает — информация тихо складируется в eventlog.
Вопрос: я правильно понимаю, что проблема где-то в библиотеке? Ведь если бы исключение было в сервисе, и оказалось бы не перехваченным, выскочило бы соответствующее окно? Или не факт?

Ну и вдруг кто-то с таким сталкивался. Интернет мне не помог.
Вот какого рода события складываются:

Event Type: Error
Event Source: COM+
Event Category: SVC
Event ID: 4194
Date: 18.07.2008
Time: 15:40:29
User: N/A
Computer: CCAPPCORP
Description:
The system has called a custom component and that component has failed and generated an exception. This indicates a problem with the custom component. Notify the developer of this component that a failure has occurred and provide them with the information below.
Component Prog ID: SC.Pool 4 4
Method Name: IDispenserDriver::AddRef
Process Name: hdx_dc.exe
The serious nature of this error has caused the process to terminate.
Exception: C0000005
Address: 0x7878F3A2
Call Stack:
comsvcs!DispManGetContext(unsigned long *,unsigned long *) + 0x992
comsvcs!DispManGetContext(unsigned long *,unsigned long *) + 0x2181

и за ним:

Event Type: Error
Event Source: COM+
Event Category: SVC
Event ID: 4097
Date: 18.07.2008
Time: 15:40:29
User: N/A
Computer: CCAPPCORP
Description:
The run-time environment has detected an inconsistency in its internal state. Please contact Microsoft Product Support Services to report this error. *** Error in __FILE__(926): Application image dump failed.

Всем спасибо!
Re: откуда выскакивает исключение?
От: pigeon Великобритания
Дата: 23.07.08 19:06
Оценка:
Здравствуйте, gazizik, Вы писали:
...
G>Exception: C0000005
...

ну у тебя access violation о чем те сказано в логе. Больше сказать нечего ибо кода нет. Как ты перехватываешь исключения? Приведи пример кода.
Premature optimization is the root of all evil in programming. Donald Knuth
Re[2]: откуда выскакивает исключение?
От: gazizik  
Дата: 24.07.08 13:50
Оценка:
Здравствуйте, pigeon, Вы писали:

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

P>...
P>G>Exception: C0000005
P>...

P>ну у тебя access violation о чем те сказано в логе. Больше сказать нечего ибо кода нет. Как ты перехватываешь исключения? Приведи пример кода.


Нет, ну это-то я понимаю. Просто, может быть кто-то сталкивался конкретно с такой ошибкой (access violation в методе IDispenserDriver::AddRef) и последующим событием Error in __FILE__(926): Application image dump failed.

Исключения перехватываются стандартным методом
try
{
// todo smth
}
catch (DWORD derr)
{
log ("dword error");
}
catch (...)
{
log ("Unexpected error");
}

Так делается и в сервисе, и в библиотеке. Т.е. если бы исключение перехватилось, об этом бы шла запись в лог.
Смущает то, что винтузовое окно об ошибке не выскакивает ...

К сожалению, сорсов одной из библиотек у меня нет. Возможно, проблема конкретно в ней. Но если бы в ней проскачило исключение, оно бы поймалось catch (...). Ведь так? Или для этого обязательно нужно пользоваться __try __except?
Re: откуда выскакивает исключение?
От: Аноним  
Дата: 24.07.08 14:34
Оценка:
Втихаря ловить и глотать AV — моветон. Раз упали — значит упали. Фиксить надо проблему, а не затыкать глотку дефолтовому exception фильтру.
А винду можно вежливо попросить рестартовать сервис в случае падения. См ChangeServiceConfig2
Re[2]: откуда выскакивает исключение?
От: gazizik  
Дата: 24.07.08 16:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Втихаря ловить и глотать AV — моветон. Раз упали — значит упали. Фиксить надо проблему, а не затыкать глотку дефолтовому exception фильтру.

А>А винду можно вежливо попросить рестартовать сервис в случае падения. См ChangeServiceConfig2

Сервис итак перестартовывается, но за эту функцию спасибо! Только этого все равно мало. Надо чтобы не падал.
Чтобы решить проблему, надо хотя бы понять, где она. Это я и пытаюсь выяснить.
Как Вы должно быть прочитали — если бы срабатывал отлов исключений — была бы запись в соответствующий лог.
Так почему же исключения не ловятся. Вот в чем вопрос...
Re[3]: откуда выскакивает исключение?
От: pigeon Великобритания
Дата: 24.07.08 17:15
Оценка:
Здравствуйте, gazizik, Вы писали:

<...>
G>Исключения перехватываются стандартным методом
G>try
G>{
G> // todo smth
G>}
G>catch (DWORD derr)
G>{
G> log ("dword error");
G>}
G>catch (...)
G>{
G> log ("Unexpected error");
G>}

G>Так делается и в сервисе, и в библиотеке. Т.е. если бы исключение перехватилось, об этом бы шла запись в лог.

G>Смущает то, что винтузовое окно об ошибке не выскакивает ...

G>К сожалению, сорсов одной из библиотек у меня нет. Возможно, проблема конкретно в ней. Но если бы в ней проскачило исключение, оно бы поймалось catch (...). Ведь так? Или для этого обязательно нужно пользоваться __try __except?


А выделенной строчке поток не создается? Может он все и валит? Дебагером не пробовали коннектиться к сервису и потом на call stack глянуть и на список потоков или написать обработчик который будет dump файл делать и потом его проанализировать? Если попробовать порассуждать то AddRef просто увеличивает counter (это конечно не факт но не будем рассматривать клинические случаи ) т.е упасть оно может когда класс который реализует интерфейс не создан или уже удален.
Premature optimization is the root of all evil in programming. Donald Knuth
Re[3]: откуда выскакивает исключение?
От: Sergey Chadov Россия  
Дата: 24.07.08 18:41
Оценка:
Здравствуйте, gazizik, Вы писали:



G>К сожалению, сорсов одной из библиотек у меня нет. Возможно, проблема конкретно в ней. Но если бы в ней проскачило исключение, оно бы поймалось catch (...). Ведь так? Или для этого обязательно нужно пользоваться __try __except?


А ключик -EHa стоит у всех модулей(если конечно MSVC)?
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[3]: откуда выскакивает исключение?
От: Аноним  
Дата: 25.07.08 07:13
Оценка:
G>Сервис итак перестартовывается, но за эту функцию спасибо! Только этого все равно мало. Надо чтобы не падал.
G>Чтобы решить проблему, надо хотя бы понять, где она. Это я и пытаюсь выяснить.
G>Как Вы должно быть прочитали — если бы срабатывал отлов исключений — была бы запись в соответствующий лог.
G>Так почему же исключения не ловятся. Вот в чем вопрос...
У вас же есть стек в репорте. Подключитесь к своему ехе и посмотрите по ln те адреса которые указаны в репорте. Скомпиляйте его естественно с символами предварительно.
try..catch в общем случае не ловят SEH. Если MSVS — ставьте set_se_translator
Re[4]: откуда выскакивает исключение?
От: gazizik  
Дата: 25.07.08 09:24
Оценка:
Здравствуйте, pigeon, Вы писали:

P>А выделенной строчке поток не создается? Может он все и валит? Дебагером не пробовали коннектиться к сервису и потом на call stack глянуть и на список потоков или написать обработчик который будет dump файл делать и потом его проанализировать? Если попробовать порассуждать то AddRef просто увеличивает counter (это конечно не факт но не будем рассматривать клинические случаи ) т.е упасть оно может когда класс который реализует интерфейс не создан или уже удален.



В выделенной строчке вызывается функция библиотеки, сорсов которой у меня нету
Дебаггером пробовала. Но судя по всему метод AddRef вызывается как раз из этой библиотечной функции — а достучаться до него у меня не получается.
Re[4]: откуда выскакивает исключение?
От: gazizik  
Дата: 25.07.08 09:28
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>А ключик -EHa стоит у всех модулей(если конечно MSVC)?


Нет... стоит /EHsc.
А замена на EHa поможет? Т.е. это будет эквивалент try except ?
Re[4]: откуда выскакивает исключение?
От: gazizik  
Дата: 25.07.08 09:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>try..catch в общем случае не ловят SEH. Если MSVS — ставьте set_se_translator


спасибо! буду пробовать
Re[5]: откуда выскакивает исключение?
От: Sergey Chadov Россия  
Дата: 25.07.08 09:57
Оценка:
Здравствуйте, gazizik, Вы писали:


G>Нет... стоит /EHsc.

G>А замена на EHa поможет?

При /EHsc catch(...) не поймает access violation. При /EHa поймает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.