Логирование исключений

Тема в разделе "WASM.WIN32", создана пользователем float, 3 мар 2012.

  1. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Стоит задача написать простенькое логирование необрабатываемых исключений в программе. Попробовал векторную обработку исключений, и тут сразу же вопрос возник - а как правильно сделать обработку толлько тех исключений, которые не смогла обработать SEH? Если просто сделать AddVectoredExceptionHandler(1,VectoredExceptionHandler); то ко мне пойдут все исключения.
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    1. Стековая маршрутизация из VEH.
    2. Замена последнего сех на совй в цепи.
    3. UEF легальный механизм.
     
  3. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    #2 понравился, это через fs[0]?
     
  4. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    AddVectoredExceptionHandler(0,VectoredExceptionHandler);
     
  5. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    Malfoy
    я все раздумывал про s маршрутизатор, но так и не понял в чем соль
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    sergegers
    Первый аргумент указывает где сделать запись в LIST_ENTRY, тоесть в начале списка или в его конце. От этого зависит очерёдность вызова вектора, но это не имеет никакого отношения к сех - вначале выполняются все VEH, затем все SEH. Последний из них(который в kernel32) вызывает UnhandlerExceptionFilter().

    sn0w
    После отработки последнего сех управление возвращается в системный диспетчер, где будет сгенерин повторно фолт. Это событие можно словить - из RtlDispatchException() возвращается результат отката фолта - если будет ноль, значит фолт не обработанный:
    Код (Text):
    1. .data
    2. g_pStub2ndf PVOID ?
    3.  
    4. .code
    5. Msg$    CHAR "UNHANDLED XCPT: Ip = 0x%p, Code = 0x%X", 13, 10, 0
    6.  
    7. XcptStub proc C
    8.     .if !al
    9.         mov eax,EXCEPTION_POINTERS.ExceptionRecord[esp]
    10.         invoke DbgPrint, addr Msg$, EXCEPTION_RECORD.ExceptionAddress[eax], EXCEPTION_RECORD.ExceptionCode[eax]
    11.         xor eax,eax
    12.     .endif
    13.     jmp g_pStub2ndf
    14. XcptStub endp
    15.  
    16. VEH proc uses ebx ExceptionPointers:PEXCEPTION_POINTERS
    17.     mov ecx,ExceptionPointers
    18.     mov edx,offset XcptStub
    19.     mov ecx,EXCEPTION_POINTERS.ExceptionRecord[ecx]
    20.     xchg dword ptr [ecx - 4*(4 + 1)],edx    ; 2 аргумента передаёт ядро, копия их передаётся в диспетчер.
    21.     xor eax,eax
    22.     mov g_pStub2ndf,edx
    23.     ret
    24. VEH endp
     
  7. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Как вариант SetUnhandledExceptionFilter(); чтобы словить все необработанные исключения.
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    slesh
    Это не вариант. Тс хочет андока и из VEH.
     
  9. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    Malfoy
    Да, было ложное воспоминание, что ставится либо перед SEH, либо после.