в том, что символьная машина
return ( _T ( "EXCEPTION_NONCONTINUABLE_EXCEPTION")); break;
case EXCEPTION_STACK_OVERFLOW :
return ( _T ( "EXCEPTION_STACK_OVERFLOW"));
break;
case EXCEPTION_INVALID_DISPOSITION :
return ( _T ( "EXCEPTION_INVALID_DISPOSITION"));
break;
case EXCEPTION_GUARD_PAGE :
return ( _T ( "EXCEPTION_GUARD_PAGE"));
break;
case EXCEPTION_INVALID_HANDLE :
return ( _T ( "EXCEPTION_INVALID_HANDLE"));
break;
default :
return ( NULL);
break;
}
}
BOOL InternalSymGetLineFromAddr ( IN HANDLE hProcess ,
IN DWORD dwAddr ,
OUT PDWORD pdwDisplacement,
OUT PIMAGEHLP_LINE Line )
{
#ifdef WORK_AROUND_SRCLINE_BUG
// Проблема заключается в том, что символьная машина находит
// только те адреса исходных строк (после первого поиска), которые
// попадают точно на нулевое смещение. Сместимся назад на 100 байт,
// чтобы найти строку, и вернем подходящее смещение.
DWORD dwTempDis = 0;
while ( FALSE == SymGetLineFromAddr ( hProcess ,
dwAddr -
dwTempDis ,
pdwDisplacement,
Line ) )
{
dwTempDis += 1;
if ( 100 == dwTempDis)
{
return ( FALSE);
}
}
// Строка найдена и информация исходной строки корректна,
// поэтому нужно изменить смещение, если требуется
// выполнить обратный поиск, чтобы найти исходную строку,
if ( 0 != dwTempDis)
{
*pdwDisplacement = dwTempDis;
}
return ( TRUE);
#else // WORK_AROUND_SRCLINE_BUG
return ( SymGetLineFromAddr ( hProcess ,
dwAddr ,
pdwDisplacement ,
Line ));
#endif
}
// Инициализировать символьную машину, если необходимо
void InitSymEng ( void)
{
if ( FALSE == g_bSymEngInit)
{
// Установить символьную машину.
DWORD dwOpts = SymGetOptions ();
// Включить загрузку строки и отложенную загрузку.
SymSetOptions ( dwOpts |
SYMOPT_DEFERRED_LOADS |
SYMOPT_LOAD_LINES );
Содержание Назад Вперед