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


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


//в состояние готовности.

InitSymEng ();

// Проверить список g_ahMod.

BOOL bCalllt = FALSE;

if ( 0 == g_uiModCount)

{

bCalllt = TRUE;

}

else {

HINSTANCE hBaseAddr = (HINSTANCE)

SymGetModuleBase ((HANDLE)GetCurrentProcessId (), (DWORD)pExPtrs->

ExceptionRecord->

ExceptionAddress);

 if ( NULL != hBaseAddr) 

{

for ( UINT i = 0; i < g__uiModCount; i ++) 

{

if ( hBaseAddr == g_ahMod[ i ]) 

{

bCalllt = TRUE; break; 

}

 }

 }

if ( TRUE == bCalllt) 

{

// Проверить перед вызовом обработчика аварии, что он все еще

 // существует в памяти.

// Пользователь может забыть зарегистрироваться,

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

// он не загружен. Однако, если какая-нибудь другая функция 

// загружена в тот же самый адрес, мало что можно сделать.

ASSERT ( FALSE == IsBadCodePtr( (FARPROC)g_pfnCallBack));

 if ( FALSE == IsBadCodePtr ( (FARPROC)g_pfnCallBack)) 

{

IRet = g_pfnCallBack ( pExPtrs); 

}

else 

{

// Вызвать предыдущий фильтр, но только после того, 

// как он закончит работу. Я просто немного параноик!:) 

ASSERT ( FALSE == IsBadCodePtr ( (FARPROC) g__pfnOrigFilt) ) ;

 if ( FALSE == IsBadCodePtr ( (FARPROC)g_pfnOrigFiIt)) 

{

IRet = g_pfnOrigFilt ( pExPtrs); 

}

}

CleanupSymEng (); 

}

_except ( EXCEPTION_EXECUTE_HANDLER) 

{

IRet = EXCEPTION_CONTINUE_SEARCH; 

}

return ( IRet); 

/*/////////////////////////////////////////////

Реализация функций-трансляторов EXCEPTION_POINTER-структyp

//////////////////////////////////////////////*/

 LPCTSTR _stdcall GetFaultReason ( EXCEPTION_POINTERS * pExPtrs) {

ASSERT ( FALSE == IsBadReadPtr ( pExPtrs,

sizeof ( EXCEPTION_POINTERS)));

 if ( TRUE = IsBadReadPtr ( pExPtrs,

sizeof ( EXCEPTION_POINTERS))) 

{

TRACEO ( "Bad parameter to GetFaultReasonA\n"); 




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



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