Отлов ошибок в MS Vista & 0xc0000374

Тема в разделе "WASM.WIN32", создана пользователем gribodemon, 23 апр 2010.

  1. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Сорри, если оффтоп.

    Возникла проблема с отладкой приложения внутри explorer.exe под вистой.
    Вообще, она рестартит explorer.exe, если там произошла ошибка. Т.е. возможности отладить приложения как бы и нет (при этом, JIT отладчик выставлен Olly).
    Единственное, где можно посмотреть сведения об ошибке - это системный журнал.
    Вопрос: как заставить Vista предлагать отладить explorer.exe, а не рестартить его?

    Теперь о самой ошибке.
    Ошибка это возникает _иногда_.
    Причём это именно свойственно только Vista. Под XP ничего подобного нет.
    Вот одна из гипотез:
    http://www.winvistatips.com/faulting-module-ntdll-dll-t578311.html
    Единственное место, в моём коде, которое может оказаться проблематичным, это переопределённые операторы new & delete:

    Код (Text):
    1. HANDLE g_p_heap = NULL;
    2.  
    3. void* __cdecl malloc(size_t _Size)
    4. {
    5.     if (!g_p_heap)
    6.     {
    7.         g_p_heap = HeapCreate(0, 0, 0);
    8.     }
    9.     void* res = RtlAllocateHeap(g_p_heap, 0, _Size);
    10.     memset(res, 0, _Size);
    11.     return res;
    12. }
    13.  
    14. void __cdecl free(void* _Memory)
    15. {
    16.     if (g_p_heap && _Memory)
    17.     {
    18.         RtlFreeHeap(g_p_heap, 0, _Memory);
    19.     }
    20. }
    21.  
    22. void* __cdecl operator new[](unsigned int size)
    23. {
    24.     return malloc(size);
    25. }
    26.  
    27. void __cdecl operator delete(void* p)
    28. {
    29.     free(p);
    30. }
    Что это вообще может означать - я тру какие-то указатели в heap'е, из-за этого, через некоторое время вываливается исключение о его повреждении или что?

    Т.е. если бы я использовал какое-нибудь страничное распределение памяти типа этого: http://forum.antichat.ru/thread37379.html, то у меня был бы просто Access Violation ?

    Вопрос: как лучше всего вылавливать такие ошибки?
     
  2. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    По первому вопрос понятно.
    Надо просто выключить Problem Reports and Solutions копибара:

     
  3. Clerk

    Clerk Забанен

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

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Кстати, интересный вопрос.
    Я пишу софт на C++.
    Обычно, если возникает ошибка, я просматриваю эту ситуацию в Olly (ну, там, выясняю причину ошибки, смотрю стэк и пр.).
    Потом возникает задача - выяснить где в C++ коде произошла эта ошибка. Собственно, я делаю Listing Files (настройка в студии) с сорцами на С++ и ASM-листингом. Ну и ищу там по последовательности команд.
    Вопрос: Как упростить задачу поиска вот этого места в C++ коде ?

    М...
    Вроде как есть PDB файлы с отладочной информацией. Вроде как там пишется исходный код. ... Умеет ли Olly подгружать их и вообще - как их использовать ?

    Я как раз про то, что в Vist'е по дефолту вырублено это.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    gribodemon
    Первая ольга читает отладочные символы отлично. Вторая не читает их. Копируете пдб в каталог с олей и открываете модуль. Таким образом я всё смотрю обычно, ядро в том числе(мне привычней видеть код под олей, а не под идой). Потом переходите на нтдлл и жмёте Search for -> Constant, вбиваете туда свой код ошибки и созерцаете процедуру, в которой эта ошибка.