| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Visual Studio 2010 некорректно работает |
| Автор: asp1rant 4.5.2010, 06:44 |
| Использую VS2010 ultimate trial; win7 eng x64 pro суть проблемы: создаю я например переменную int* a = NULL; и сразу пишу : *a = 1; выполение доходит до этой строчки и программа тупо вылетает. а должно бросаться исключение, типа, access violation(или что там). из-за этого не могу нормально отлаживать программы, везде где есть массивы, или указатели, у которых что-то неверно с памятью - там сразу вылетает :( до этого сидел на vs2010 RC1, та же лажа была, думал поставлю релиз и все исправится, а нет. пишу win32 project, console app. юзаю winAPI. все настройки по умолчанию. как исправить? |
| Автор: azesmcar 4.5.2010, 13:47 | ||
| - это SEH исключения, их сиплюсплюсшным try-catch-ом не поймаешь..да их и не надо ловить, надо писать так, чтобы они не вылетали. Если ну очень надо - тогда так
|
| Автор: azesmcar 4.5.2010, 14:30 | ||||||||||
и что? одно как-то мешает другому?
мне хотелось бы понять, у вас было просто желание что-то написать или вы с чем-то несогласны? тогда с чем именно?
т.е. это не обычное C++ исключение и должно ловиться методами structured exception handling. с этим?
с этим? или вы считаете, что вот так
access violation не ловиться? |
| Автор: Abyx 4.5.2010, 15:14 | ||||
| azesmcar, 1. Термин "SEH исключения" - неверный впринципе. Исключения не зависят от того что их ловит, особенно аппаратные. 2. AV ловится try-catch блоком С++ Справочная информация:
Добавлено через 4 минуты и 57 секунд
исключение бросается в любом случае. возможно у вас неправильно настроен отладчик Добавлено через 11 минут и 53 секунды Сейчас проверил у себя (Microsoft Visual C++ 2010 RC1) - все работает как надо - при простом запуске(ctrl-F5) вылезает системное сообщение об ошибке, при запуске под отладчиком (F5) вылезает сообщение о AV: "Unhandled exception at 0x00f91378 in av_test.exe: 0xC0000005: Access violation writing location 0x00000000." |
| Автор: Abyx 4.5.2010, 15:35 |
| разумеется чтобы try-catch ловил AV, надо компилить код с опцией /EHa (Enable C++ Exceptions = "Yes with SEH Exceptions (/EHa)") однако это не делает AV "SEH-исключением" =) |
| Автор: azesmcar 4.5.2010, 15:46 | ||||||
ну и? еще одно сообщение не в тему..причем тут это? я где-то говорил, что они зависят от того, что их ловит? пора писать жалобу в микрософт, они неверные термины используют
Справочная информация:
отличная справочная информация, только совершенно не в тему.
AV НЕ ЛОВИТЬСЯ блоком try-catch. Причем тут опции компилятора? если вы говорите о C++ - то уж будьте любезны, не вмешивайте сюда студию, где в стандарте сказано, что это try-catch ловит AV? Прошу указать главу и строку, иначе этот разговор лишен всякого смысла. Если завтра в опции VS добавят галочку, которая сделает int типом с плавающей запятой вы будете писать, что int это тип с плавающей запятой? |
| Автор: Abyx 4.5.2010, 15:57 | ||
Ага, в в русской версии студии эта строчка выглядит как "Да, с SEH исключениями (/EHa)". Однако словосочетание "SEH исключения" не верно, т.к. SEH - это structured exception handling - способ обработки исключений, а исключения не связаны с способом их обработки, они такие же SEH исключения, как и VEH исключения, UnhandledExceptionHandler-исключения, ИсключенияПойманныеОтладчиком-исключения, и ЛюбойДругойСпособОбработкиИсключений-исключения.
Убирая кавычки, Вы искажаете смысл цитаты. Это была цитата Вас, а не использование мной этого неправильного термина. |
| Автор: azesmcar 4.5.2010, 16:01 | ||
ага, в русском звучит также, никаких проблем с переводом. Только вот вы почему-то решили что повсеместно используемый термин вдруг стал неправильным..понятно Я уже написал в первом посте, одно другому не мешает, это аппаратное исключение, но смысл моего поста был не рассказать о внутренностях AV а рассказать о его отлове, что термин SEH довольно понятно выражает, и термин SEH exception я не из себя придумал, как видите он довольно часто используется, в том числе и Microsoft-ом. |
| Автор: Abyx 4.5.2010, 16:07 | ||||||
Не передергивайте, то Вы говорите "представляете, мы говорим о Visual Studio и windows", то вдруг оказывается что речь о стандартном С++. Опции компилятора при том, какой код будет генериться, и что он будет делать. Там можно вообще убрать исключения С++. В стандарте нет определения AV, т.к. это особенность конкретной платформы. Зато в стандарте сказано что catch(...) ловит любые исключения.
Добавлено через 1 минуту и 18 секунд azesmcar, а почему вы называете AV "SEH exception", не "VEH exception"? Добавлено через 3 минуты и 55 секунд
Я вижу что ГУИ писали и локализовали безграмотные люди. Например у Рихтера я что-то не встречал термина "SEH exception". |
| Автор: azesmcar 4.5.2010, 16:12 | ||
и что? конечно, я думаю чтобы понять что речь идет о C++ исключениях не надо быть гением. |
| Автор: Abyx 4.5.2010, 16:22 |
| azesmcar, а что по вашему - C++ исключения? Если я скажу вам, что ядро написано на С++, и оно делает throw когда ловит AV, то AV станет C++ исключением? Кстати "SEH исключения" - "структурированная обработка исключений исключения" - это безграмотно не только с точки зрения значения этой фразы, но и с точки зрения правил русского языка. В свою очередь "Structured Exception Handling Exception" - это безграмотно с точки зрения английского языка. http://msdn.microsoft.com/en-us/library/ms680657%28VS.85%29.aspx Вот тут написано какие бывают исключения, и "Structured Exception Handling Exception" там почему-то нет. |
| Автор: azesmcar 4.5.2010, 16:46 | ||||||||
имелось ввиду, что это ловиться с помощью SEH а не C++ try-catch -а. Еслиб я предлагал VEH может быть я так бы и написал. повторюсь
т.е. с этим вы не согласны? Добавлено @ 16:48
нет, потому что до моей программы это C++ исключение не доходит, его кто-то там ловит и выдает в несколько ином виде.
тоже самое можно сказать и про словосочетание "SQL Query", но его используют. |
| Автор: SVN74 4.5.2010, 17:08 |
| Хух... |
| Автор: Abyx 4.5.2010, 17:10 | ||
Отловом исключений должен заниматься компилятор. Как именно он это сделает - это его проблемы. Совсем не обязательно, чтобы исключение ловилось SEH. Оно может ловиться VEH, оно может ловиться обработчиком по умолчанию. |
| Автор: azesmcar 4.5.2010, 17:12 | ||
а это уже другой вопрос, я предложил SEH, если желаете - можете предложить свой вариант отлова нужного ТС исключения, я предложил SEH и по мне - так это полностью соответствует запросу ТС. Я и не собирался перечислять все возможные варианты. |
| Автор: Abyx 4.5.2010, 17:16 | ||
я имел ввиду реализацию (implementation) try-catch |
| Автор: azesmcar 4.5.2010, 17:18 | ||
но это не значит, что обращению к нулевому указателю надо писать в try-catch -е, все равно этот код платформозависим, а так он еще и станет настройкозависимым. Уж лучше __try ... __except Добавлено через 1 минуту и 6 секунд
вообще как я уже писал - лучше избегать этого исключения, нежели ловить его. |
| Автор: asp1rant 4.5.2010, 18:06 |
| кончай холивар!!! вопрос в том, почему на этот раз исключение не бросается, а ведь раньше в 2008 было! |
| Автор: azesmcar 4.5.2010, 18:14 | ||||||
о каком исключении идет речь? о каком коде? я только что проверил, VS2010 ultimate при настройке Yes with SEH Exceptions (/EHa) ловит вот так
и без этой настройки вот так
не знаю как там себя Release Candidate ведет, но в release-е я не заметил отличий от VS2008 по этой части. |
| Автор: Abyx 4.5.2010, 18:34 |
| azesmcar, я проверял такой же код на RC1, все работает asp1rant, покажи код который у тебя не работает, и напиши командную строку компилятора (последняя страница настроек) |
| Автор: azesmcar 4.5.2010, 18:44 |
В тоже почему-то уверен что проблема у автора в коде |
| Автор: xvr 6.5.2010, 11:44 |
| 2 azesmcar и Abyx - кончайте спорить, горячие финские парни SEH - это механизм ОС Windows, try/catch - это языковая конструкция языка С++. __try/__except - это расширение языка (и С и С++) от MS (которое адаптировали к себе и другие производители компиляторов) для поддержки SEH. Т.е. try/catch не обязан как либо пересекаться с SEH - это совершенно независимые сущности. Однако производители компиляторов под Windows имеют право в своих реализациях этих компиляторов пересечь их любым удобным для них (и пользователей) способом - в частности научить try/catch перехватывать SEH (или не учить, как им захочется |
| Автор: azesmcar 6.5.2010, 12:16 |
мы уже как бы давно закончили |
| Автор: boostcoder 6.5.2010, 12:32 | ||
может немного не в тему, но мне не понятно, почему этот код должен генерировать исключение?
нормальный, рабочий код. завершается, как и ожидалось, с Segmentation fault. откуда компилятору знать, что "t" указывает на NULL? |
| Автор: xvr 6.5.2010, 12:36 | ||||
|
| Автор: boostcoder 6.5.2010, 12:40 |
наверное, было бы не плохо. наверное все же от обоих(обеих?). это понятно. |
| Автор: W4FhLF 6.5.2010, 12:42 |
Это системное исключение, которое генерится с помощью механизма аппаратных прерываний. |
| Автор: boostcoder 6.5.2010, 12:45 | ||
да, точно. вспомнил из опыта программирования на асме для DOS |
| Автор: asp1rant 6.5.2010, 14:13 |
| ок, вот код: void clearHand( Hand* pHand1) { int i; ListCard* pListCard1, *pPrevListCard; pPrevListCard = pHand1->pListCards; if (pHand1->pListCards) pListCard1 = pHand1->pListCards->pNextList; else pListCard1 = NULL; for(i=0; i < pHand1->countCards; i++) { free(pPrevListCard); pPrevListCard = pListCard1; pListCard1 = pListCard1->pNextList; } free(pPrevListCard); pHand1->countCards = 0; pHand1->pListCards = NULL; } на итерации i =5 перед красной строчкой переменная pListCard1 = 0x00000000 {pCard=??? pNextList=??? } на строке pListCard1 = pListCard1->pNextList; VS тупо останавливает выполнение, нужно самому жать кнопку stop debugging. тот же код в 2005 студии бросает исключение. сам код уже давно исправлен, условие изменено i < pHand1->countCards-1, но студия то тупит(или я туплю). командные строки: /ZI /nologo /W3 /WX- /Od /Oy- /D "_MBCS" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug\Durak.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /analyze- /errorReport:queue и /OUT:"E:\Sasha\study\3_course\ОС\курсовая\Durak\Debug\Durak.exe" /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Debug\Durak.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"E:\Sasha\study\3_course\ОС\курсовая\Durak\Debug\Durak.pdb" /PGD:"E:\Sasha\study\3_course\ОС\курсовая\Durak\Debug\Durak.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE |
| Автор: azesmcar 6.5.2010, 14:29 | ||
и где тут /EHa? и где вообще try .. catch? |
| Автор: asp1rant 6.5.2010, 21:31 |
| ну я как бы не шарю в этом, вопрос и был в том, как сделать чтоб включить |
| Автор: Abyx 6.5.2010, 21:33 |
| asp1rant, прочитай эту тему еще раз. Тут писали как это включить. |