C++ 如何捕获内存异常?

C++ 如何捕获内存异常?,c++,windows,memory,seh,C++,Windows,Memory,Seh,我在捕获异常时遇到问题,这是错误: Hello.exe中0x01034BB1处未处理的异常:0xC0000005:Access 违反读取位置0x02343DA2 这是我的代码: bool VerifyAddress(HANDLE hwnd, DWORD dwAddress, char* bMask, char *szMask ) { PBYTE *pTemp = { 0 }; for ( int i = 0; *szMask; ++szMask, ++bMask, ++i )

我在捕获异常时遇到问题,这是错误:

Hello.exe中0x01034BB1处未处理的异常:0xC0000005:Access 违反读取位置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;
}
bool验证地址(HANDLE-hwnd、DWORD-dwAddress、char*bMask、char*szMask)
{
PBYTE*pTemp={0};
对于(int i=0;*szMask;++szMask,++bMask,++i)
{
试一试{
if(!ReadProcessMemory(hwnd,reinterpret_cast(dwAddress+i),&pTemp,sizeof(pTemp),0)){
failedpm++;
返回false;
}
}捕获(…){
failedpm++;
返回false;
}
如果(*szMask=='x'&&reinterpret\u cast(pTemp)!=reinterpret\u cast(*bMask)){
failedMask++;
返回false;
}
}
返回true;
}
DWORD FindPattern(句柄hwnd、字符*bMask、字符*szMask)
{
对于(DWORD dwCurrentAddress=0x015A1DB4;dwCurrentAddress<0x7FFFFFF;dwCurrentAddress++){
if(验证地址(hwnd、dwCurrentAddress、bMask、szMask)){
返回当前地址;
}
}
返回0x0;
}

<>我有一个问题:为什么catch不捕获?< /p> < p>这不是C++异常,你可以捕捉它,它访问无效内存。无法保证该过程处于捕获任何内容的正常状态


在您的特定情况下,
pTemp
可能有问题,可能是一个常量。显示代码。

这不是C++异常,可以捕获,它正在访问无效内存。无法保证该过程处于捕获任何内容的正常状态

在您的特定情况下,
pTemp
可能有问题,可能是一个常量。向我们展示代码。

您可以使用。
\uu try
\uu除外
关键字是特定于Microsoft编译器的

不过,有几点需要考虑:

    <>你不能混合C++和SEH异常处理。结果将是未定义的
  • 不当处理SEH异常可能会危及流程完整性
  • SEH异常处理程序只应在极少数情况下使用。在您的特定情况下,它可能会隐藏一个在别处徘徊的bug
这样一来,您可能应该分析问题并修复错误。您可以使用轻松捕获内存损坏错误。您还可以将Visual Studio的调试器设置为在引发SEH异常时中断(调试->Windows->异常设置:Win32 Exceptions)。

您可以使用。
\uu try
\uu除外
关键字是特定于Microsoft编译器的

不过,有几点需要考虑:

    <>你不能混合C++和SEH异常处理。结果将是未定义的
  • 不当处理SEH异常可能会危及流程完整性
  • SEH异常处理程序只应在极少数情况下使用。在您的特定情况下,它可能会隐藏一个在别处徘徊的bug

这样一来,您可能应该分析问题并修复错误。您可以使用轻松捕获内存损坏错误。还可以设置VisualStudio的调试器以中断,当SEH异常被引发时(调试-> Windows >异常设置:Win32异常).< /P>,因为这并不会导致异常。因为C++异常不会捕获硬错误。您使用哪一个编译器?访问违规是结构化异常(不是C++异常),使用微软VisualStudio,您需要打开结构化异常处理。请参阅:我将尝试使用
/EHa
作为异常处理模型。请参阅更多细节。可能的副本,因为这并不是真正导致异常。因为C++异常不会捕获硬错误。您使用哪一个编译器?访问违规是结构化异常(不是C++异常),使用微软VisualStudio,您需要打开结构化异常处理。请参阅:我将尝试使用
/EHa
作为异常处理模型。请参阅以了解更多详细信息。pTemp的可能副本可能在堆栈上,并已损坏堆栈,这就是它无法捕获的原因…我编辑了我的代码,现在它已完成,感谢您的帮助。你现在能帮我吗?我需要看看FindPattern是如何被调用的。pTemp可能在堆栈上,并且破坏了堆栈,这就是为什么它无法捕获…我编辑了我的代码,现在它已经完成了,谢谢你的帮助。你现在能帮我吗?我需要看看FindPattern是如何被调用的。非常详细的答案。总之,我编辑了我的代码,现在已经完成了,谢谢你的帮助。你现在能帮我吗?回答得很详细。总之,我编辑了我的代码,现在已经完成了,谢谢你的帮助。你现在能帮我吗?