I'm not looking for a way to solve this problem, just to understand the reason for this. A colleague showed me the code that caused access violation when compiling Visual Studio 2008 to work under Windows Mobile 6 ARMV4I. The same code worked fine under x86 Windows, and it claims to work under Linux, compiled by GCC (I haven't confirmed this yet). I brought the question to the code below:
int main( int argc, char* argv[] ) { try { throw std::runtime_error( "a" ); } catch( std::runtime_error& e1 ) { try { try { throw std::runtime_error( "b" ); } catch( std::runtime_error& e11 ) { throw; } } catch( std::runtime_error& e12 ) { e12.what();
Aside from questions about whether this code is reasonable, can someone explain what causes an access violation when std::runtime_error::what() is called in the code above?
Thanks PaulH
Edit: Column:
test.exe!wmain(int argc = 1, wchar_t** argv = 0x00040080) Line: 169, Byte Offsets: 0xd8 C++ _CallSettingFrame test.exe!CallCatchBlock(EHExceptionRecord* pExcept = 0x1803eb0c, unsigned long int* pRN = 0x1803fc18, _CONTEXT* pContext = 0x1803f014, _s_FuncInfo* pFuncInfo = 0x00023960, void* handlerAddress = 0x00011494, int CatchDepth = 0, unsigned long int NLGCode = 256) Line: 878, Byte Offsets: 0x258 C++ test.exe!__InternalCxxFrameHandler(EHExceptionRecord* pExcept = 0x1803eb0c, unsigned long int* pRN = 0x1803f2f8, _CONTEXT* pContext = 0x1803f014, _DISPATCHER_CONTEXT* pDC = 0x1803e824, _s_FuncInfo* pFuncInfo = 0x00023960, int CatchDepth = 0) Line: 179, Byte Offsets: 0xfc C++ test.exe!__CxxFrameHandler3(EHExceptionRecord* pExcept = 0x1803eb0c, unsigned long int* pRN = 0x1803f2f8, _CONTEXT* pContext = 0x1803f014, _DISPATCHER_CONTEXT* pDC = 0x1803e824) Line: 242, Byte Offsets: 0x54 C++ 0xf000fffc = 0x1803eb0c, unsigned long int * pRN = 0x1803f2f8, _CONTEXT * pContext = 0x1803f014, _DISPATCHER_CONTEXT * pDC = 0x1803e824, _s_FuncInfo * pFuncInfo = 0x00023960, int CatchDepth = test.exe!wmain(int argc = 1, wchar_t** argv = 0x00040080) Line: 169, Byte Offsets: 0xd8 C++ _CallSettingFrame test.exe!CallCatchBlock(EHExceptionRecord* pExcept = 0x1803eb0c, unsigned long int* pRN = 0x1803fc18, _CONTEXT* pContext = 0x1803f014, _s_FuncInfo* pFuncInfo = 0x00023960, void* handlerAddress = 0x00011494, int CatchDepth = 0, unsigned long int NLGCode = 256) Line: 878, Byte Offsets: 0x258 C++ test.exe!__InternalCxxFrameHandler(EHExceptionRecord* pExcept = 0x1803eb0c, unsigned long int* pRN = 0x1803f2f8, _CONTEXT* pContext = 0x1803f014, _DISPATCHER_CONTEXT* pDC = 0x1803e824, _s_FuncInfo* pFuncInfo = 0x00023960, int CatchDepth = 0) Line: 179, Byte Offsets: 0xfc C++ test.exe!__CxxFrameHandler3(EHExceptionRecord* pExcept = 0x1803eb0c, unsigned long int* pRN = 0x1803f2f8, _CONTEXT* pContext = 0x1803f014, _DISPATCHER_CONTEXT* pDC = 0x1803e824) Line: 242, Byte Offsets: 0x54 C++ 0xf000fffc
Output Window:
RaiseException: Thread=96ec78d0 Proc=80096c70 'test.exe' AKY=00000801 PC=03f91e7c(coredll.dll+0x00043e7c) RA=88037538(NK.EXE+0x00007538) BVA=00000000 FSR=00000000 RaiseException: Thread=96ec78d0 Proc=80096c70 'test.exe' AKY=00000801 PC=03f91e7c(coredll.dll+0x00043e7c) RA=88037538(NK.EXE+0x00007538) BVA=00000000 FSR=00000000 RaiseException: Thread=96ec78d0 Proc=80096c70 'test.exe' AKY=00000801 PC=03f91e7c(coredll.dll+0x00043e7c) RA=88037538(NK.EXE+0x00007538) BVA=00000000 FSR=00000000 Data Abort: Thread=96ec78d0 Proc=80096c70 'test.exe' AKY=00000801 PC=000114ac(test.exe+0x000014ac) RA=0002095c(test.exe+0x0001095c) BVA=5061654c FSR=00000405 First-chance exception at 0x000114ac in test.exe: 0xC0000005: Access violation reading location 0x5061654c.
Edit2: This article contains a defect report report in Microsoft Connect.