Как я могу поймать исключение памяти?
У меня проблема с перехватом исключения, это ошибка:
Необработанное исключение в 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).