|
|
|
Исключения в релизе не обрабатываются
|
|||
|---|---|---|---|
|
#18+
Привет всем! MSVC6SP5 проект Win32 Console Разбирался с работой исключений - наткнулся на один интересный момент: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Нашел разницу в параметрах компилятора: в релизе меняется ключик /Od (без оптимизации) на /O2 (Maximize Speed). Ставишь в релизе /Od - начинает обрабатывать. MSDNTo enable C++ exception handling in your code, use /GX. /GX есть. Или MS решили что Maximize Speed можно получить за счет пропуска обработки исключений? Minimize Size, кстати, тот же эффект. Кто-нибудь с этим уже сталкивался? Или такое только у меня? Кто хочет сам попробовать: создать новый проект "Win32 Console", тип "Hello world" и в main() вставить этот код. PS замена на __try ... __except проблему решает, но как понимаю в этом случае могут иногда некорректно деструкторы отработать, а иногда вообще не компилируется - ругается на использование объектов классов с деструктором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 13:11 |
|
||
|
Исключения в релизе не обрабатываются
|
|||
|---|---|---|---|
|
#18+
Никто не сталкивался? У кого VC6 попробуйте, может только у меня так происходит? И второе, можно как-то в препроцессоре тип оптимизации компилятора проверить? Чтобы при компиляции сообщение было, что-то типа: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 10:00 |
|
||
|
Исключения в релизе не обрабатываются
|
|||
|---|---|---|---|
|
#18+
У меня подтвердилось! Покопался и вроде нашёл причину: Код: plaintext 1. (MSDN, "Exception Handling: Default Synchronous Exception Model") Я проверил, вставил вызов функции с exception внутрь try, и попал в catch. Кроме того, существует ключ компилятора /EH, который регулирует "the model of exception handling" (на него есть ссылка на упомянутой странице MSDN). Убрал вызов функции, поставил ключ /EHa ("asynchronous"), и тоже попал в catch. То есть не всё так плохо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 14:47 |
|
||
|
Исключения в релизе не обрабатываются
|
|||
|---|---|---|---|
|
#18+
Насчёт вызова функции я похоже погорячился. Оно её или оптимизирует так, что она ничего не делает вообще, или Unhandled Exception происходит внутри функции :( В своих программах я пользуюсь try/catch, и в релизе оно тоже работает, но у меня нет catch(...), а только типизированное (например, CDBException), поэтому я с такой проблемой не сталкивался. С ключом /EHa таки входит в catch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 14:55 |
|
||
|
Исключения в релизе не обрабатываются
|
|||
|---|---|---|---|
|
#18+
На самом деле у тебя просто в релизе программа грохается из-за чего-то типа защиты памяти. 1) Проверь чтобы в опциях компиляции стояло /EHa : Use /EHa to specify the asynchronous exception handling model (C++ exception handling with structured exception handling exceptions). /EHa may result in a less performant image because the compiler will not optimize a catch block as aggressively, even if the compiler does not see a throw. Use /EHa if you want to catch an exception raised with something other than a throw. The following sample will generate an exception: Или помести все в еще один стек для SEH-exceptions. Но это НЕ ПОМОЖЕТ найти проблему, естественно. 2) Ищи багу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 14:58 |
|
||
|
Исключения в релизе не обрабатываются
|
|||
|---|---|---|---|
|
#18+
Спасибо: /EHa помогло. Я исключения использую только для перехвата багов своих и чужих (код не полностью мой). Типа нарушения защиты памяти, деления на ноль и т.п. Прога занимается приемом/передачей на сервак в инете и одно из требований чтобы она могла работать автономно (на серваке из планировщика например), т.е. произошло исключение, перехватил, в лог записал и завершился. Нехорошо если конечные пользователи видят предложение "обратиться к разработчику". Несколько раз такое замечали и не могли понять что это такое, все свалили на установку dial-up содинения, т.к. win отдельный поток создает при использовании RAS. Воссоздать проблему у себя не удалось. Чтобы по максимому баги отловить на debug версии сделал код обработки исключений только в релизе: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2007, 08:25 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34479886&tid=2028990]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
3ms |
| others: | 266ms |
| total: | 513ms |

| 0 / 0 |
