Re[7]: sprintf и надежность программы
От: denisku Россия  
Дата: 24.08.04 13:31
Оценка:
Здравствуйте, 0xVLD, Вы писали:

VLD>Вообще, по-моему catch(...) — это майкрософтовская фишка.

нет, это стандартная вещь.
Извините за потраченный траффик..
Re[5]: sprintf и надежность программы
От: Basil2 Россия https://starostin.msk.ru
Дата: 24.08.04 14:13
Оценка:
VLD>>Попробуй установить свой фильтр необработанных исключений через SetUnhandledExceptionFilter
VLD>(это если на все и вся сразу, чтобы вообще не падала)

Попробовал, но почему-то вызов циклится. Использую следующий код:

LONG __stdcall MyExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
   printf( "Exception, code is %x, flags %x!\n",
           ExceptionInfo->ExceptionRecord->ExceptionCode,
           ExceptionInfo->ExceptionRecord->ExceptionFlags );
   logMain.Add(PR_HI, "ERROR Exception!");

   if (! ExceptionInfo->ExceptionRecord->ExceptionFlags) // continuable
      return EXCEPTION_CONTINUE_EXECUTION;
   else
      return EXCEPTION_EXECUTE_HANDLER;
}

void main()
{
   SetUnhandledExceptionFilter(MyExceptionFilter);
   *(PBYTE) 0 = 0;
   printf("end");
}


Выход получается такой:

Exception, code is c0000005, flags 0!
Exception, code is c0000005, flags 0!
Exception, code is c0000005, flags 0!
Exception, code is c0000005, flags 0!
Exception, code is c0000005, flags 0!


(c0000005 — access violation)
Почему так может быть?
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re[7]: sprintf и надежность программы
От: Basil2 Россия https://starostin.msk.ru
Дата: 24.08.04 14:24
Оценка:
B>>Большое спасибо! Попробовал:
B>>__try / __except работает (ага!), но try/catch нет.

VLD>У меня(VS .NET и VS6 на WinXP) — catch (...) все вроде бы ловит.


Это я виноват — я компилирую из командной строки, и у меня не был указан ключ /EHa — обработка C++ исключений. С ним все отлично работает!
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re[6]: sprintf и надежность программы
От: 0xVLD  
Дата: 25.08.04 11:51
Оценка:
Здравствуйте, Basil2, Вы писали:


B>Почему так может быть?


Потому что выполнение продолжается с той же самой инструкции.

При EXCEPTION_CONTINUE_EXECUTION надо что-то делать для устранения ошибки, либо написать код, чтобы возобновлять выполнение со следующей инструкции.
Re[7]: sprintf и надежность программы
От: Basil2 Россия https://starostin.msk.ru
Дата: 25.08.04 12:51
Оценка:
Здравствуйте, 0xVLD, Вы писали:

VLD>Потому что выполнение продолжается с той же самой инструкции.

VLD>При EXCEPTION_CONTINUE_EXECUTION надо что-то делать для устранения ошибки, либо написать код, чтобы возобновлять выполнение со следующей инструкции.

А это вообще реально написать? Как?
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re[8]: sprintf и надежность программы
От: 0xVLD  
Дата: 26.08.04 13:27
Оценка:
Здравствуйте, Basil2, Вы писали:

B>Здравствуйте, 0xVLD, Вы писали:


VLD>>Потому что выполнение продолжается с той же самой инструкции.

VLD>>При EXCEPTION_CONTINUE_EXECUTION надо что-то делать для устранения ошибки, либо написать код, чтобы возобновлять выполнение со следующей инструкции.

B>А это вообще реально написать? Как?


Можно все в отдельных потоках запускать и завершать поток при возникновении исключения, при необходимости запускать новый.

Можно попытаться изменить информацию об исключении. Скажем, адрес инструкции в которой возникло исключение.
Re[9]: sprintf и надежность программы
От: Basil2 Россия https://starostin.msk.ru
Дата: 27.08.04 07:26
Оценка:
Здравствуйте, 0xVLD, Вы писали:

VLD>>>Потому что выполнение продолжается с той же самой инструкции.

VLD>>>При EXCEPTION_CONTINUE_EXECUTION надо что-то делать для устранения ошибки, либо написать код, чтобы возобновлять выполнение со следующей инструкции.

VLD>Можно попытаться изменить информацию об исключении. Скажем, адрес инструкции в которой возникло исключение.


А как это (хоть приблизительно) делается? Как я узнаю, на сколько байтов надо сдвинуть указатель вперед? (размер сбойной команды)
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.