AddVectoredExceptionHandler ловит не все эксепшны

Тема в разделе "WASM.X64", создана пользователем Velheart, 10 июн 2008.

  1. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Всем привет. Собственно проблема описана в сабже, схематично:
    Код (Text):
    1. ....
    2. SetBreakpoint(breakpointAddr1);
    3. ...
    4. SetBreakpoint(breakpointAddrX);
    5. ...
    6. AddVectoredExceptionHandler(TRUE, BreakpointsHandler);
    7. ...
    B результате иногда программа вылетает с эксепшном при вполнении необрабатываемого int 3, по одному из тех адресов, куда ставились брейкпойнты.. В версии для х86 все работало нормально, подскажите, плз, кто знает с чем это может быть связано.
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    кстати ап, тема актуальна =)
     
  3. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    int 3 === 0xcc ?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    У вас в 10-й строке диспетчера исключений ошибка. Там нужно условие подправить.
     
  5. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    _basmp_
    да
    Clerk
    он кагбэ даже не вызывается =)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    nobodyzzz
    RtlCallVectoredExceptionHandlers() вызывается ?
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    nobodyzzz
    Ну скока ждать.. что отладчик завис или что ?
     
  8. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Clerk
    хм... что-то у меня такой функции в ntdll нету(или я что не так делаю)
    [​IMG]
    версия ntdll.dll 5.2.3790.3959 (srv03_sp2_rtm.070216-1710)
     
  9. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    есть RtlpCallVectoredHandlers, но она не вызывается
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Трек(Trace) диспетчера исключений в студию.
     
  11. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    как-то не получается =(
    [​IMG]
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ну так как понять почему не вызывается то, что должно быть вызвано.
    Там сразу должен стоять вызов векторного обработчика исключений. Идёт проверка головы списка обработчиков, есть зареганые - будет вызван. Перед этим идёт захват критической секции и дешифровка указателя.
    Где именно выполняется переход нитуда ?
     
  13. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Clerk
    проблема в том что брейкпоинт в диспетчере исключений(если я ничего не напутал и это KiUserExceptionDispatcher(а вообще пробовал ставить на все функции из RtlpFunctionAddressTable)) поставленый в WinDBG не срабатывает. С чем это может быть связано?
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Олей продебаж, или есчо чем. Я не юзаю виндбг, поэтому ничего не могу сказать.
     
  15. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Clerk
    у ольки разве есть поддержка х64?
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Я забыл что x64.. Тут нужно у когото есчо спросить почему точки останова не ставяться/не срабатывают в виндбг.
     
  17. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    я так понимаю под x64 структура, на которую указывает RtlpCalloutEntryList совпадает с описаной здесь http://www.wasm.ru/print.php?article=veh (_VECTORED_EXCEPTION_NODE)? Так вот на выходе из AddVectoredExceptionHandler m_pfnVectoredHandler = baadf00d`00000001 т.к. память под _VECTORED_EXCEPTION_NODE выделяется RtlAllocateHeap похоже на то что поле m_pfnVectoredHandler не было заполнено, что весьма странно т.к. остальные поля структуры заполнены. Вообщем мистика какая-то
     
  18. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    nobodyzzz
    Ох, что же сегодня такое творится. First-Chance Exception, Last-Chance Exception — говорит о чём-нибудь? First-Chance: жми меню Debug -> Go Unhandled Exception.


    Единственное, из-за чего реально может не вызываться векторный хендлер — очень хитрое повреждение кучи (ведь там хранятся элементы списка, ага), или сброс бита Peb.ProcessUsingVEH.

    А так вызов VEH в x64 аналогичен x86 — только вместо RtlCallVectoredExceptionHandlers сразу вызвается RtlpCallVectoredHandlers (хотя вызов RtlCallVectoredContinueHandlers оставили как есть лол).