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


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


g_stFrame.AddrStack.Offset = pExPtrs->ContextRecord->Esp;

 g_stFrame.AddrStack.Mode = AddrModeFlat ;

g_stFrame.AddrFrame.Offset = pExPtrs->ContextRecord->Ebp;

 g_stFrame.AddrFrame.Mode = AddrModeFlat ;

#else

g_stFrame.AddrPC.Offset = (DWORD)pExPtrs->ContextRecord->Fir;

 g_stFrame.AddrPC.Mode = AddrModeFlat;

 g_stFrame.AddrReturn.Offset =

(DWORD)pExPtrs->ContextRecord->IntRa; 

g_stFrame.AddrReturn.Mode = AddrModeFlat; 

g_stFrame.AddrStack.Offset =

(DWORD)pExPtrs->ContextRecord->IntSp; 

g_stFrame.AddrStack.Mode = AddrModeFlat; 

g_stFrame.AddrFrame.Offset -

(DWORD)pExPtrs->ContextRecord->IntFp; 

g_stFrame.AddrFrame.Mode = AddrModeFlat;

#endif

return ( InternalGetStackTraceString ( dwOpts, pExPtrs)); 

}

 LPCTSTR BUGSUTIL_DLLINTERFACE _stdcall

GetNextStackTraceString ( DWORD dwOpts ,

EXCEPTION_POINTERS * pExPtrs) 

{

// Все проверки ошибок — в InternalGetStackTraceString.

 // Предполагается, что GetFirstStackTraceString уже 

// инициализировала информацию в кадре стека,

 return ( InternalGetStackTraceString ( dwOpts, pExPtrs)); 

}

BOOL _stdcall CH__ReadProcessMemory ( HANDLE ,

LPCVOID IpBaseAddress ,

 LPVOID IpBuffer , 

DWORD nSize ,

 LPDWORD IpNumberOfBytesRead ) 

{

return ( ReadProcessMemory ( GetCurrentProcess (),

IpBaseAddress ,

 IpBuffer ,

nSize , 

IpNumberOfBytesRead ));

}

// Внутренняя функция, которая выполняет все проходы по стеку

LPCTSTR _stdcall

InternalGetStackTraceString ( DWORD dwOpts ,

EXCEPTION_POINTERS * pExPtrs ) 

{

ASSERT ( FALSE == IsBadReadPtr ( pExPtrs

sizeof ( EXCEPTION_POINTERS)));

 if ( TRUE == IsBadReadPtr ( pExPtrs ,

sizeof ( EXCEPTION_POINTERS))) 

{

TRACED ( "GetStackTraceString — invalid pExPtrs!\n");

 return ( NULL); 

}

// Возвращаемое значение LPCTSTR szRet;

// Временная переменная для общего пользования.


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



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