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


         

пока поток отладки не стабилизируется,


VERIFY ( CloseHandle ( hStartAck));
return ( INVALID_HANDLE_VALUE); 
}
// Ждать, пока поток отладки не стабилизируется, и запустить
::WaitForSingleObject ( hStartAck, INFINITE);
// Освободить дескриптор уведомления.
VERIFY ( CloseHandle ( hStartAck));
// Проверить, выполняется ли еще поток отладки. Если нет,
// отладка, вероятно, не может стартовать.
DWORD dwExitCode = ~STILL_ACTIVE;
if ( FALSE == GetExitCodeThread ( hDbgThread, SdwExitCode))
{
ASSERT ( !"GetExitCodeThread failed!");
return ( INVALID_HANDLE_VALUE); 
}
ASSERT ( STILL_ACTIVE = dwExitCode);
 if ( STILL_ACTIVE != dwExitCode)
{
TRACE ( "StartDebugging : GetExitCodeThread failedXn");
return ( INVALID_HANDLE_VALUE); 
}
// Создать события синхронизации, чтобы главный поток мог 
// сообщать циклу отладки, что делать.
 BOOL bCreateDbgSyncEvts =
CreateDebugSyncEvents ( IpDebugSyncEvents, *lpPID);
 ASSERT ( TRUE = bCreateDbgSyncEvts);
 if ( FALSE = bCreateDbgSyncEvts)
{
// Это — серьезная проблема. Есть выполняющийся поток отладки,
//но нет возможности создавать события синхронизации, которые
// нужны потоку пользовательского интерфейса для управления
// потоком отладки. Здесь можно только завершить поток отладки и
// выполнить возврат. Больше сделать ничего нельзя.
TRACE ( "StartDebugging : CreateDebugSyncEvents failedW) ;
VERIFY ( TerminateThread ( hDbgThread, (DWORD)-1));
return ( INVALID_HANDLE_VALUE);
}
return ( hDbgThread); 
}
И, наконец, операторы утверждений используются в том случае, когда возникает необходимость проверить некоторое предположение. Например, если в спецификациях функции говорится о том, что она требует 3 Мбайт дискового пространства, то нужно проверить это предположение с помощью оператора утверждения. Другой пример: если функция получает (через аргумент вызова) массив указателей на определенную структуру данных, то необходимо проверить данные этой структуры и подтвердить правильность каждого индивидуального элемента.

Содержание  Назад  Вперед