Отладка приложений


Использование CrashHandler API - часть 5


 LONG IRet = EXCEPTION_CONTINUE_SEARCH;

// Если возбуждено исключение EXCEPTION_STACK_OVERFLOW (переполнение 

// стека исключений), то мало что можно сделать, потому что стек 

// переполнен. Если вы ничего не предпримете, то велики шансы, что // возникнет двойная ошибка и вы разрушите свой фильтр исключений. 

// Хотя я не рекомендую это делать, но можно попробовать 

// управлять регистром стека так, чтобы освободить 

// достаточно места для выполнения этих функций. Конечно, если вы // изменили регистр стека, то возникнут проблемы с его прохождением.

 //Я избрал безопасный путь и выполняю здесь несколько обращений //к OutputDebugString. Существует риск двойной ошибки, но 

// благодаря тому, что OutputDebugString очень мало использует

 // стек (примерно 8-16 байт), это — стоящий шаг.

 // Ваши пользователи могут также загрузить программу

 // DebugView/Enterprise Edition

// Марка Руссиновича (Mark Russinovich) с узла www.sysinternals.com.

 // Единственная проблема

// состоит в том, что я не могу даже удостовериться, что

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

//К счастью, EXCEPTION_STACK_OVERFLOW не случается очень часто.

 // Заметьте, что я еще вызываю ваш обработчик аварий.

 // Кроме того, в случае если переполненный стек разрушает ваш

 // обработчик аварий, здесь выполняется протоколирование.

 if ( EXCEPTION_STACK_OVERFLOW ==

pExPtrs->ExceptionRecord->ExceptionCode)

 {

OutputDebugString ( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); 

OutputDebugString ( "EXCEPTION_STACK_OVERFLOW occurred\n"); OutputDebugString ( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); 

}

_try

 {

if ( NULL != g_pfnCallBack)

 {

// Здесь должна быть инициализирована символьная машина,

// так чтобы можно было отыскать информацию базового модуля

// об адресе аварии, а заодно и привести символьную машину




Начало  Назад  Вперед



Книжный магазин