Как я могу поймать исключение памяти?

У меня проблема с перехватом исключения, это ошибка:

Необработанное исключение в 0x01034BB1 в Hello.exe: 0xC0000005: расположение чтения нарушения доступа 0x02343DA2.

Это мой код:

bool VerifyAddress(HANDLE hwnd, DWORD dwAddress, char* bMask, char *szMask )
{
    PBYTE *pTemp = { 0 };

    for ( int i = 0; *szMask; ++szMask, ++bMask, ++i )
    {

        try {
            if ( !ReadProcessMemory( hwnd, reinterpret_cast<LPCVOID>(dwAddress + i), &pTemp, sizeof(pTemp), 0 ) ){
                failedRPM++;
                return false;
            }
        } catch(...) {
            failedRPM++;
            return false;
        }

        if ( *szMask == 'x' && reinterpret_cast<char*>(pTemp) != reinterpret_cast<char*>(*bMask)){
            failedMask++;
            return false;
        }
    }
    return true;
}

DWORD FindPattern(HANDLE hwnd, char* bMask, char *szMask )
{
    for ( DWORD dwCurrentAddress = 0x015A1DB4; dwCurrentAddress < 0x7FFFFFF; dwCurrentAddress++ ){
        if ( VerifyAddress( hwnd, dwCurrentAddress, bMask, szMask )) {
            return dwCurrentAddress;
        }
    }
    return 0x0;
}

У меня только вопрос: почему улов не ловит?

2 ответа

Это не исключение C++, которое вы можете поймать, это доступ к недействительной памяти. Там нет никакой гарантии, что процесс находится в нормальном состоянии для ловли чего-либо.

В вашем конкретном случае, возможно, что-то не так с pTempМожет быть, это константа. Покажите нам код.

Вы можете перехватывать исключения SEH с помощью оператора try-Кроме. __try а также __except ключевые слова являются специфическими для компиляторов Microsoft.

Однако есть несколько соображений:

  • Вы не можете смешивать обработку исключений C++ и SEH. Результат будет неопределенным.
  • Неправильная обработка исключений SEH может поставить под угрозу целостность процесса.
  • Обработчики исключений SEH следует использовать только в очень редких случаях. В вашем конкретном случае это, вероятно, скроет ошибку, оставшуюся в другом месте.

После этого вам, вероятно, следует проанализировать проблему и исправить ошибку. Вы можете использовать Application Verifier, чтобы легко выявлять ошибки повреждения памяти. Вы также можете настроить отладчик Visual Studio на разрыв, когда возникает исключение SEH (Debug -> Windows -> Exception Settings: Win32 Exceptions).

Другие вопросы по тегам