Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(asp1rant @  4.5.2010,  06:44 Найти цитируемый пост)
access violation(или что там)
 - это SEH исключения, их сиплюсплюсшным try-catch-ом не поймаешь..да их и не надо ловить, надо писать так, чтобы они не вылетали.
Если ну очень надо - тогда так
Код

__try {
    int * t = NULL;
    *t = 0;
} __except (EXCEPTION_EXECUTE_HANDLER) {
    std::cout << "SEH exception" << std::endl;
}

Автор: Abyx 4.5.2010, 14:18
Цитата(azesmcar @  4.5.2010,  13:47 Найти цитируемый пост)
- это SEH исключения, их сиплюсплюсшным try-catch-ом не поймаешь..

это аппаратные исключения, 
представляете, в никсах SEH нет, а такие исключения есть!

в msvc try-catch реализуется через SEH опцией компилятора.
впрочем оно и так должно работать

Автор: azesmcar 4.5.2010, 14:30
Цитата(Abyx @  4.5.2010,  14:18 Найти цитируемый пост)
это аппаратные исключения, 

и что? одно как-то мешает другому?
Цитата

Structured exception handling (SEH) is a mechanism for handling both hardware and software exceptions. Therefore, your code will handle hardware and software exceptions identically.

Цитата

Exceptions can be initiated by hardware or software, and can occur in kernel-mode as well as user-mode code. Structured exception handling provides a single mechanism for the handling of kernel-mode and user-mode exceptions.

The execution of certain instruction sequences can result in exceptions that are initiated by hardware. For example, an access violation is generated by the hardware when a process attempts to read from or write to a virtual address to which it does not have the appropriate access.


Цитата(Abyx @  4.5.2010,  14:18 Найти цитируемый пост)
представляете, в никсах SEH нет, а такие исключения есть!

 smile боже мой...и что? представляете, мы говорим о Visual Studio и windows и юникс тут совсем уж непричем.

мне хотелось бы понять, у вас было просто желание что-то написать или вы с чем-то несогласны? тогда с чем именно?
Цитата

это SEH исключения

т.е. это не обычное C++ исключение и должно ловиться методами structured exception handling.
с этим?
Цитата

их сиплюсплюсшным try-catch-ом не поймаешь

с этим?
или вы считаете, что вот так
Код

__try {
    int * t = NULL;
    *t = 0;
} __except (EXCEPTION_EXECUTE_HANDLER) {
    std::cout << "SEH exception" << std::endl;
}

access violation не ловиться?

Автор: Abyx 4.5.2010, 15:14
azesmcar, 
1. Термин "SEH исключения" - неверный впринципе. Исключения не зависят от того что их ловит, особенно аппаратные.
2. AV ловится try-catch блоком С++

Справочная информация:
Цитата("Windows Via C/C++")

However, you should know that Microsoft's Visual C++ compiler has implemented C++ exception handling using the operating system's structured exception handling. So, when you create a C++ try block, the compiler is generating an SEH __try block. A C++ catch test becomes an SEH exception filter, and the code in the catch block becomes the code in the SEH __except block.


Добавлено через 4 минуты и 57 секунд
Цитата(asp1rant @  4.5.2010,  06:44 Найти цитируемый пост)
выполение доходит до этой строчки и программа тупо вылетает. а должно бросаться исключение, типа, access violation(или что там).
из-за этого не могу нормально отлаживать программы, везде где есть массивы, или указатели, у которых что-то неверно с памятью - там сразу вылетает :(

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

Добавлено через 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
Цитата(Abyx @  4.5.2010,  15:14 Найти цитируемый пост)
Термин "SEH исключения" - неверный впринципе. 


Цитата(Abyx @  4.5.2010,  15:14 Найти цитируемый пост)
Исключения не зависят от того что их ловит, особенно аппаратные.

ну и? еще одно сообщение не в тему..причем тут это? я где-то говорил, что они зависят от того, что их ловит?

Цитата(Abyx @  4.5.2010,  15:35 Найти цитируемый пост)
Yes with SEH Exceptions 

пора писать жалобу в микрософт, они неверные термины используют smile 

Цитата(Abyx @  4.5.2010,  15:14 Найти цитируемый пост)
However, you should know that Microsoft's Visual C++ compiler has implemented C++ exception handling using the operating system's structured exception handling. So, when you create a C++ try block, the compiler is generating an SEH __try block. A C++ catch test becomes an SEH exception filter, and the code in the catch block becomes the code in the SEH __except block.

Справочная информация:
Цитата

Aleksandr Sergeyevich Pushkin (Russian: Алекса́ндр Серге́евич Пу́шкин, pronounced [ɐlʲɪˈksandr sʲɪˈrɡʲejevʲɪtɕ ˈpuʃkʲɪn]  ( listen)) (June 6 [O.S. May 26] 1799–February 10 [O.S. January 29] 1837) was a Russian author of the Romantic era[1] who is considered by many to be the greatest Russian poet[2][3][4][5] and the founder of modern Russian literature.[6][7] Pushkin pioneered the use of vernacular speech in his poems and plays, creating a style of storytelling—mixing drama, romance, and satire—associated with Russian literature ever since and greatly influencing later Russian writers. He also wrote historical fiction. His Marie: A Story of Russian Love provides insight into Russia during the reign of Catherine the Great.

отличная справочная информация, только совершенно не в тему.

Цитата(Abyx @  4.5.2010,  15:14 Найти цитируемый пост)
2. AV ловится try-catch блоком С++

Цитата(Abyx @  4.5.2010,  15:35 Найти цитируемый пост)
разумеется чтобы try-catch ловил AV, надо компилить код с опцией /EHa (Enable C++ Exceptions = "Yes with SEH Exceptions (/EHa)")

AV НЕ ЛОВИТЬСЯ блоком try-catch. Причем тут опции компилятора? если вы говорите о C++ - то уж будьте любезны, не вмешивайте сюда студию, где в стандарте сказано, что это try-catch ловит AV? Прошу указать главу и строку, иначе этот разговор лишен всякого смысла.
Если завтра в опции VS добавят галочку, которая сделает int типом с плавающей запятой вы будете писать, что int это тип с плавающей запятой?

Автор: Abyx 4.5.2010, 15:57
Цитата(azesmcar @  4.5.2010,  15:46 Найти цитируемый пост)
пора писать жалобу в микрософт, они неверные термины используют

Ага, в в русской версии студии эта строчка выглядит как "Да, с SEH исключениями (/EHa)".
Однако словосочетание "SEH исключения" не верно, т.к. SEH - это structured exception handling - способ обработки исключений,
а исключения не связаны с способом их обработки, они такие же SEH исключения, как и VEH исключения, UnhandledExceptionHandler-исключения, ИсключенияПойманныеОтладчиком-исключения, и ЛюбойДругойСпособОбработкиИсключений-исключения.
Цитата(azesmcar @  4.5.2010,  15:46 Найти цитируемый пост)
Цитата(Abyx @  4.5.2010,  15:35 Найти цитируемый пост)
SEH-исключением

вы опять используете неправильный термин...ай ай ай.

Убирая кавычки, Вы искажаете смысл цитаты. Это была цитата Вас, а не использование мной этого неправильного термина.

Автор: azesmcar 4.5.2010, 16:01
Цитата(Abyx @  4.5.2010,  15:57 Найти цитируемый пост)
Ага, в в русской версии студии эта строчка выглядит как "Да, с SEH исключениями (/EHa)".
Однако словосочетание "SEH исключения" не верно, т.к. SEH - это structured exception handling - способ обработки исключений,

ага, в русском звучит также, никаких проблем с переводом. Только вот вы почему-то решили что повсеместно используемый термин вдруг стал неправильным..понятно smile 
Я уже написал в первом посте, одно другому не мешает, это аппаратное исключение, но смысл моего поста был не рассказать о внутренностях AV а рассказать о его отлове, что термин SEH довольно понятно выражает, и термин SEH exception я не из себя придумал, как видите он довольно часто используется, в том числе и Microsoft-ом.

Автор: Abyx 4.5.2010, 16:07
Цитата(azesmcar @  4.5.2010,  15:46 Найти цитируемый пост)
причем тут опции компилятора? если вы говорите о C++ - то уж будьте любезны, не вмешивайте сюда студию, где в стандарте сказано, что это try-catch ловит AV? Прошу указать главу и строку, иначе разговор про try-catch C++ не имеет никакого смысла. 

Не передергивайте, то Вы говорите "представляете, мы говорим о Visual Studio и windows", то вдруг оказывается что речь о стандартном С++.

Опции компилятора при том, какой код будет генериться, и что он будет делать. Там можно вообще убрать исключения С++.
В стандарте нет определения AV, т.к. это особенность конкретной платформы.
Зато в стандарте сказано что catch(...) ловит любые исключения.
Цитата("ISO\IEC 14882 15.3 p5")

A ... in a handler’s exception-declaration functions similarly to ... in a function parameter declaration; it
specifies a match for any exception.


Добавлено через 1 минуту и 18 секунд
azesmcar, а почему вы называете AV "SEH exception", не "VEH exception"?

Добавлено через 3 минуты и 55 секунд
Цитата(azesmcar @  4.5.2010,  16:01 Найти цитируемый пост)
как видите он довольно часто используется, в том числе и Microsoft-ом.

Я вижу что ГУИ писали и локализовали безграмотные люди.
Например у Рихтера я что-то не встречал термина "SEH exception".

Автор: azesmcar 4.5.2010, 16:12
Цитата(Abyx @  4.5.2010,  16:07 Найти цитируемый пост)
Не передергивайте, то Вы говорите "представляете, мы говорим о Visual Studio и windows", то вдруг оказывается что речь о стандартном С++.

и что? smile мы не можем говорить о разном? сперва я говорил про VS, потом говорил про C++, во время разговора про VS вы упомянули Unix а во время разговора про C++ вы упоминаете опции VS. Я сказал что стандартный C++ try-catch это исключение не поймает, вы говорите что поймает..если компилятор VS соответственно настроить..чувствуете?

Цитата(Abyx @  4.5.2010,  16:07 Найти цитируемый пост)
Зато в стандарте сказано что catch(...) ловит любые исключения.

конечно, я думаю чтобы понять что речь идет о 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
Цитата(Abyx @  4.5.2010,  16:07 Найти цитируемый пост)
azesmcar, а почему вы называете AV "SEH exception", не "VEH exception"?

имелось ввиду, что это ловиться с помощью SEH а не C++ try-catch -а. Еслиб я предлагал VEH может быть я так бы и написал. 
повторюсь
Цитата(azesmcar @  4.5.2010,  14:30 Найти цитируемый пост)
т.е. это не обычное C++ исключение и должно ловиться методами structured exception handling.

т.е. с этим вы не согласны?

Добавлено @ 16:48
Цитата(Abyx @  4.5.2010,  16:22 Найти цитируемый пост)
azesmcar, а что по вашему - C++ исключения?
Если я скажу вам, что ядро написано на С++, и оно делает throw когда ловит AV, то AV станет C++ исключением?

нет, потому что до моей программы это C++ исключение не доходит, его кто-то там ловит и выдает в несколько ином виде.
Цитата(Abyx @  4.5.2010,  16:22 Найти цитируемый пост)
Кстати "SEH исключения" - "структурированная обработка исключений исключения" - это безграмотно не только с точки зрения значения этой фразы, но и с точки зрения правил русского языка. В свою очередь "Structured Exception Handling Exception" - это безграмотно с точки зрения английского языка.

тоже самое можно сказать и про словосочетание "SQL Query", но его используют.

Автор: SVN74 4.5.2010, 17:08
Хух...  smile  Turbo C++ ловит smile 

Автор: Abyx 4.5.2010, 17:10
Цитата(azesmcar @  4.5.2010,  16:46 Найти цитируемый пост)
т.е. это не обычное C++ исключение и должно ловиться методами structured exception handling.
т.е. с этим вы не согласны?

Отловом исключений должен заниматься компилятор. Как именно он это сделает - это его проблемы. Совсем не обязательно, чтобы исключение ловилось SEH. Оно может ловиться VEH, оно может ловиться обработчиком по умолчанию.

Автор: azesmcar 4.5.2010, 17:12
Цитата(Abyx @  4.5.2010,  17:10 Найти цитируемый пост)
Отловом исключений должен заниматься компилятор. 

 smile с каких пор, try-catch уже никто не пишет? Т.е. компилятор должен отловить исключение, догадаться что именно мне надо сделать при этом исключении и сгенерировать код?
Цитата

Совсем не обязательно, чтобы исключение ловилось SEH. Оно может ловиться VEH, оно может ловиться обработчиком по умолчанию. 

а это уже другой вопрос, я предложил SEH, если желаете - можете предложить свой вариант отлова нужного ТС исключения, я предложил SEH и по мне - так это полностью соответствует запросу ТС. Я и не собирался перечислять все возможные варианты.

Автор: Abyx 4.5.2010, 17:16
Цитата(azesmcar @  4.5.2010,  17:12 Найти цитируемый пост)
 с каких пор, try-catch уже никто не пишет? Т.е. компилятор должен отловить исключение, догадаться что именно мне надо сделать при этом исключении и сгенерировать код?

я имел ввиду реализацию (implementation) try-catch

Автор: azesmcar 4.5.2010, 17:18
Цитата(Abyx @  4.5.2010,  17:16 Найти цитируемый пост)
я имел ввиду реализацию (implementation) try-catch 

но это не значит, что обращению к нулевому указателю надо писать в try-catch -е, все равно этот код платформозависим, а так он еще и станет настройкозависимым. Уж лучше __try ... __except

Добавлено через 1 минуту и 6 секунд
Цитата(azesmcar @  4.5.2010,  17:18 Найти цитируемый пост)
но это не значит, что обращению к нулевому указателю надо писать в try-catch -е, все равно этот код платформозависим, а так он еще и станет настройкозависимым. Уж лучше __try ... __except

вообще как я уже писал - лучше избегать этого исключения, нежели ловить его.

Автор: asp1rant 4.5.2010, 18:06
кончай холивар!!! вопрос в том, почему на этот раз исключение не бросается, а ведь раньше в 2008 было!

Автор: azesmcar 4.5.2010, 18:14
Цитата(asp1rant @  4.5.2010,  18:06 Найти цитируемый пост)
кончай холивар!!! вопрос в том, почему на этот раз исключение не бросается, а ведь раньше в 2008 было! 

о каком исключении идет речь? о каком коде? 
я только что проверил, VS2010 ultimate при настройке Yes with SEH Exceptions (/EHa) ловит вот так
Код

try
{
    int *t = 0;
    *t = 10;
} catch (...)
{
    std::cout << "Exception" << std::endl;
}

и без этой настройки вот так
Код

__try
{
    int *t = 0;
    *t = 10;
} __except (EXCEPTION_EXECUTE_HANDLER)
{
    std::cout << "Exception" << std::endl;
}

не знаю как там себя Release Candidate ведет, но в release-е я не заметил отличий от VS2008 по этой части.

Автор: Abyx 4.5.2010, 18:34
azesmcar, я проверял такой же код на RC1, все работает


asp1rant, покажи код который у тебя не работает, и напиши командную строку компилятора (последняя страница настроек)

Автор: azesmcar 4.5.2010, 18:44
Цитата(Abyx @  4.5.2010,  18:34 Найти цитируемый пост)
azesmcar, я проверял такой же код на RC1, все работает

В тоже почему-то уверен что проблема у автора в коде smile 

Автор: xvr 6.5.2010, 11:44
2 azesmcar и Abyx - кончайте спорить, горячие финские парни  smile 
SEH - это механизм ОС Windows, try/catch - это языковая конструкция языка С++. __try/__except - это расширение языка (и С и С++) от MS (которое адаптировали к себе и другие производители компиляторов) для поддержки SEH. Т.е. try/catch не обязан как либо пересекаться с SEH - это совершенно независимые сущности. Однако производители компиляторов под Windows имеют право в своих реализациях этих компиляторов пересечь их любым удобным для них (и пользователей) способом - в частности научить try/catch перехватывать SEH (или не учить, как им захочется  smile )

Автор: azesmcar 6.5.2010, 12:16
Цитата(xvr @  6.5.2010,  11:44 Найти цитируемый пост)
2 azesmcar и Abyx - кончайте спорить, горячие финские парни  smile 

мы уже как бы давно закончили smile 

Автор: boostcoder 6.5.2010, 12:32
может немного не в тему, но мне не понятно, почему этот код должен генерировать исключение?
Код

try {
   int *t = 0;
   *t = 10;
} catch (...) {
   std::cout << "Exception" << std::endl;
}

нормальный, рабочий код. завершается, как и ожидалось, с Segmentation fault.
откуда компилятору знать, что "t" указывает на NULL?

Автор: xvr 6.5.2010, 12:36
Цитата(boostcoder @  6.5.2010,  12:32 Найти цитируемый пост)
может немного не в тему, но мне не понятно, почему этот код должен генерировать исключение?
Не должен, но может. Все зависит от доброй воли реализаторов компилятора и/или рантайма. Чисто технически конвертация signal/fault/SEH/etc в throw вполне возможна
Цитата

откуда компилятору знать, что "t" указывает на NULL? 
Если бы он это знал, он бы обругался еще на этапе компиляции

Автор: boostcoder 6.5.2010, 12:40
Цитата(xvr @  6.5.2010,  12:36 Найти цитируемый пост)
Не должен, но может

наверное, было бы не плохо.

Цитата(xvr @  6.5.2010,  12:36 Найти цитируемый пост)
Все зависит от доброй воли реализаторов компилятора и/или рантайма.

наверное все же от обоих(обеих?).

Цитата(xvr @  6.5.2010,  12:36 Найти цитируемый пост)
Если бы он это знал, он бы обругался еще на этапе компиляции

это понятно.

Автор: W4FhLF 6.5.2010, 12:42
Цитата(Abyx @  4.5.2010,  14:18 Найти цитируемый пост)
это аппаратные исключения


Это системное исключение, которое генерится с помощью механизма аппаратных прерываний. 

Автор: boostcoder 6.5.2010, 12:45
Цитата(W4FhLF @  6.5.2010,  12:42 Найти цитируемый пост)
Это системное исключение, которое генерится с помощью механизма аппаратных прерываний.  

да, точно.
вспомнил из опыта программирования на асме для DOS smile 

Автор: 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
Цитата(asp1rant @  6.5.2010,  14:13 Найти цитируемый пост)
/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 

и где тут /EHa?
и где вообще try .. catch?

Автор: asp1rant 6.5.2010, 21:31
ну я как бы не шарю в этом, вопрос и был в том, как сделать чтоб включить smile

Автор: Abyx 6.5.2010, 21:33
asp1rant, прочитай эту тему еще раз. Тут писали как это включить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)