Как проигнорировать assert ?
От: overt Ниоткуда  
Дата: 19.11.08 11:15
Оценка:

When the application is linked with a debug version of the run-time libraries, assert creates a message box with three buttons: Abort, Retry, and Ignore. If the user clicks Abort, the program aborts immediately. If the user clicks Retry, the debugger is called and the user can debug the program if just-in-time (JIT) debugging is enabled. If the user clicks Ignore, assert continues with its normal execution: creating the message box with the OK button. Note that clicking Ignore when an error condition exists can result in undefined behavior.

Языками не владею, поэтому мог неверно понять вышесказанное. Т.е. из этого мне совершенно не ясно, как должно вести себя консольное приложение со сработавшим assert() в _DEBUG сборке при нажатии кнопки Ignore. В действительности само окошко с кнопкой Ingore вызывается из ф-ии abort(), так что шансов на продолжение выполнения программы уже нет. В случае Ignore в консоль выводится дополнительное сообщение:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

после чего приложение благополучно завершается через _exit(3) в конце ф-ии abort().
Если нажать Abort, приложение завершается без дополнительных сообщений в глубинах abort...__crtMessageWindow(), тоже вызвовом _exit(3).

В чем тогда суть Ignore, если я не могу проигнорировать сработавший assert() ??
(MS VS 7.1/8.0)
Re: Как проигнорировать assert ?
От: Sergey Россия  
Дата: 19.11.08 11:51
Оценка:
"overt" <73041@users.rsdn.ru> wrote in message news:3180546@news.rsdn.ru...
>

> When the application is linked with a debug version of the run-time libraries, assert creates a message box with three buttons: Abort, Retry, and Ignore. If the user clicks Abort, the program aborts immediately. If the user clicks Retry, the debugger is called and the user can debug the program if just-in-time (JIT) debugging is enabled. If the user clicks Ignore, assert continues with its normal execution: creating the message box with the OK button. Note that clicking Ignore when an error condition exists can result in undefined behavior.

> Языками не владею, поэтому мог неверно понять вышесказанное. Т.е. из этого мне совершенно не ясно, как должно вести себя консольное приложение со сработавшим assert() в _DEBUG сборке при нажатии кнопки Ignore. В действительности само окошко с кнопкой Ingore вызывается из ф-ии abort(), так что шансов на продолжение выполнения программы уже нет. В случае Ignore в консоль выводится дополнительное сообщение:
>

> This application has requested the Runtime to terminate it in an unusual way.
> Please contact the application's support team for more information.

> после чего приложение благополучно завершается через _exit(3) в конце ф-ии abort().
> Если нажать Abort, приложение завершается без дополнительных сообщений в глубинах abort...__crtMessageWindow(), тоже вызвовом _exit(3).
>
> В чем тогда суть Ignore, если я не могу проигнорировать сработавший assert() ??

Насколько я помню, abort оно по-дефолту зовет только для консольных приложений, причем достаточно вызвать _set_error_mode(_OUT_TO_MSGBOX); в начале работы, и ассерты можно будет игнорировать.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Как проигнорировать assert ?
От: overt Ниоткуда  
Дата: 19.11.08 12:15
Оценка:
Здравствуйте, Sergey, Вы писали:

Спасибо. Работает.
Только все равно не ясно, где в документации по assert() об этом можно прочитать.
(MS VS 7.1/8.0)
Re[3]: Как проигнорировать assert ?
От: Sergey Россия  
Дата: 19.11.08 12:28
Оценка:
"overt" <73041@users.rsdn.ru> wrote in message news:3180633@news.rsdn.ru...

> Спасибо. Работает.

> Только все равно не ясно, где в документации по assert() об этом можно прочитать.

Нигде, скорее всего — я, помнится, по исходникам смотрел чего это она так странно работает.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Как проигнорировать assert ?
От: overt Ниоткуда  
Дата: 19.11.08 12:58
Оценка:
У меня еще вопрос:

Как работать с ф-ей
_set_abort_behavior()

?

Из документации толком не ясно.

#define _WRITE_ABORT_MSG    0x1
#define _CALL_REPORTFAULT   0x2

unsigned int __cdecl _set_abort_behavior(unsigned int flags, unsigned int mask)
{
    unsigned int oldflags = __abort_behavior;
    __abort_behavior = oldflags & (~mask) | flags & mask;
    return oldflags;
}


По умолчанию выставлен _WRITE_ABORT_MSG. Как мне его убрать, и поставить _CALL_REPORTFAULT ?
Не могу совладать с комбинацией:
__abort_behavior = oldflags & (~mask) | flags & mask;


Получилось след. образом:
    _set_abort_behavior( 0, _WRITE_ABORT_MSG);
    _set_abort_behavior( _CALL_REPORTFAULT , _CALL_REPORTFAULT);


Но мне кажется должен быть способ сделать это одним вызовом ф-ии.
(MS VS 7.1/8.0)
Re[5]: Как проигнорировать assert ?
От: Sergey Россия  
Дата: 19.11.08 13:07
Оценка:
"overt" <73041@users.rsdn.ru> wrote in message news:3180714@news.rsdn.ru...

> По умолчанию выставлен _WRITE_ABORT_MSG. Как мне его убрать, и поставить _CALL_REPORTFAULT ?

> Не могу совладать с комбинацией:
>
__abort_behavior = oldflags & (~mask) | flags & mask;

>
> Получилось след. образом:
>
>    _set_abort_behavior( 0, _WRITE_ABORT_MSG);
>    _set_abort_behavior( _CALL_REPORTFAULT , _CALL_REPORTFAULT);
>

>
> Но мне кажется должен быть способ сделать это одним вызовом ф-ии.

А так:
_set_abort_behavior( _CALL_REPORTFAULT , _CALL_REPORTFAULT | _WRITE_ABORT_MSG);
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Как проигнорировать assert ?
От: overt Ниоткуда  
Дата: 19.11.08 13:18
Оценка:
Здравствуйте, Sergey, Вы писали:

S>А так:

S>
_set_abort_behavior( _CALL_REPORTFAULT , _CALL_REPORTFAULT | _WRITE_ABORT_MSG);


Спасибо.
(MS VS 7.1/8.0)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.