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


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


Эта переменная 

// сохраняет область стека. DWORD dwTemp;

// Базовый адрес модуля. Я отыскиваю его прямо после прохода

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

DWORD dwModBase; 

_try 

{

// Инициализировать символьную машину в случае, если она

 //не инициализирована. 

InitSymEng ();

#ifdef _WIN64

#define CH_MACHINE IMAGE_FILE_MACHINE_IA64

 #else

#define CH_MACHINE IMAGE_FILE_MACHINE_I386

#endif

// Замечание: Если функции исходных файлов и номеров строк

// используются, StackWalk может вызвать останов по нарушению

// доступа.

BOOL bSWRet = StackWalk ( CH_MACHINE ,

(HANDLE)GetCurrentProcessId () , 

GetCurrentThread () , 

&g_stFrame , 

pExPtrs->ContextRecord ,

 (PREAD_PROCESS_MEMORY_ROUTINE)

CH_ReadProcessMemory , 

SymFunctionTableAccess ,

 SymGetModuleBase , 

NULL ) ;

if ( ( FALSE = bSWKet) 11(0= g_stFrame.AddrFrame.Offset)) 

{

szRet = NULL; 

_leave; 

}

// Прежде чем все подсчитывать,

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

 // из StackWalk, действительно существует. Бывает,

 // что StackWalk, возвращает TRUE, но адрес не принадлежит 

// модулю процесса. 

dwModBase = SymGetModuleBase ( (HANDLE)GetCurrentProcessId (),

g_stFrame.AddrPC.Offset ); 

if ( 0 == dwModBase) 

{

szRet = NULL;

 _leave; 

}

int iCurr = 0;

// Как минимум получить адрес, 

#ifdef _WIN64

iCurr += wsprintf ( g_szBuff + iCurr , 

_T ( "Ox%016X") ,

g_stFrame.AddrPC.Offset );

 #else

iCurr += wsprintf ( g_szBuff + iCurr , 

_T ( "%04X:%08X") 

pExPtrs->ContextReeord->SegCs, g_stFrame.AddrPC.Offset ); 

#endif

// Вывести параметры?

if ( GSTSO_PARAMS == ( dwOpts & GSTSO_PARAMS))

{

iCurr += wsprintf ( g_szBuff + iCurr , 

_T ( " ( Ox%08X Ox%08X "\

"Ox%08X Ox%08X)"), 

g_stFrame.Params[ 0 ] ,




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



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