вопрос про исключения
От: Аноним  
Дата: 05.08.11 19:09
Оценка:
Подскажите пожалуйста как из обработчика исключения узнать в каком месте это исключение было сгенерировано ?
Re: вопрос про исключения
От: DM.PROFF Россия  
Дата: 06.08.11 03:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста как из обработчика исключения узнать в каком месте это исключение было сгенерировано ?


Если под местом подразумевается адрес, то можно так

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;    
    }
Re[2]: вопрос про исключения
От: Аноним  
Дата: 06.08.11 06:03
Оценка:
Здравствуйте, DM.PROFF, Вы писали:

DP>Здравствуйте, Аноним, Вы писали:


А>>Подскажите пожалуйста как из обработчика исключения узнать в каком месте это исключение было сгенерировано ?


DP>Если под местом подразумевается адрес, то можно так


извиняюсь, вопрос не правильно сформулировал
отладчик остановился в обработчике исключений
как определить адрес инструкции, которая вызвала это исключение
Re[3]: вопрос про исключения
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 06.08.11 10:24
Оценка: 1 (1)
А>>>Подскажите пожалуйста как из обработчика исключения узнать в каком месте это исключение было сгенерировано ?

DP>>Если под местом подразумевается адрес, то можно так


А>извиняюсь, вопрос не правильно сформулировал

А>отладчик остановился в обработчике исключений
А>как определить адрес инструкции, которая вызвала это исключение

Все правильно подсказали: на NT/i386+ нужно вытащить этот контекст из параметров KiUserExceptionDispatcher и прочих _nlg_return. Например так: Getting an exception call stack from the catch block
Viva el Junta Militar! Viva el Presidente!
Re[2]: вопрос про исключения
От: Centaur Россия  
Дата: 06.08.11 14:21
Оценка:
Здравствуйте, 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, указатели отлично умеют сами выводиться в потоки ввода-вывода.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.