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


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


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 );




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



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