Подскажите пожалуйста как из обработчика исключения узнать в каком месте это исключение было сгенерировано ?
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста как из обработчика исключения узнать в каком месте это исключение было сгенерировано ?
Если под местом подразумевается адрес, то можно так
CONTEXT context;
EXCEPTION_RECORD er;
__try
{
...
}
__except (er = *(GetExceptionInformation())->ExceptionRecord,
context = *(GetExceptionInformation())->ContextRecord,
EXCEPTION_EXECUTE_HANDLER)
{
// x86
cout << "Exception Address is: 0x" << hex << (DWORD) er.ExceptionAddress << endl;
cout << "EIP from context is: 0x" << hex << context.Eip << endl;
// x64
cout << "Exception Address is: 0x" << hex << (DWORD64) er.ExceptionAddress << endl;
cout << "RIP from context is: 0x" << hex << context.Rip << endl;
}
А>>>Подскажите пожалуйста как из обработчика исключения узнать в каком месте это исключение было сгенерировано ?
DP>>Если под местом подразумевается адрес, то можно так
А>извиняюсь, вопрос не правильно сформулировал
А>отладчик остановился в обработчике исключений
А>как определить адрес инструкции, которая вызвала это исключение
Все правильно подсказали: на NT/i386+ нужно вытащить этот контекст из параметров KiUserExceptionDispatcher и прочих _nlg_return. Например так:
Getting an exception call stack from the catch block
Здравствуйте, DM.PROFF, Вы писали:
DP>EXCEPTION_RECORD er;
[…]
DP> // x86
DP> cout << "Exception Address is: 0x" << hex << (DWORD) er.ExceptionAddress << endl;
DP> // x64
DP> cout << "Exception Address is: 0x" << hex << (DWORD64) er.ExceptionAddress << endl;
Зачем здесь каст, тем более платформозависимый? er.ExceptionAddress имеет тип PVOID, указатели отлично умеют сами выводиться в потоки ввода-вывода.