почему может не ловить краши UnhandledExceptionFilter?
От: ksd Россия  
Дата: 04.07.17 08:59
Оценка:
Ситуация такая: прога написана на C++ в MS VS. Иногда вылетает окно о GPF, запись в системном журнале есть. В проге делается SetUnhandledExceptionFilter, где в обработчике должен бы создаваться минидамп:
LONG SEHandler( _EXCEPTION_POINTERS *pExceptionInfo )
{
    LONG ret = EXCEPTION_CONTINUE_SEARCH;
    HMODULE hDll = LoadLibrary( _T("DBGHELP.DLL") );
    MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)GetProcAddress( hDll, "MiniDumpWriteDump" );
    // szDumpPath = GetTempPath + имя проги + датавремя
    HANDLE hFile = ::CreateFile( szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    if (hFile!=INVALID_HANDLE_VALUE)
    {
        _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
        ExInfo.ThreadId = ::GetCurrentThreadId();
        ExInfo.ExceptionPointers = pExceptionInfo;
        ExInfo.ClientPointers = NULL;
    if (pDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL ))
            ret = EXCEPTION_EXECUTE_HANDLER;
    CloseHandle(hFile);
    }
    return ret;
}

однако что то никак дампов не создается, т.е. не попадает в SEHandler: что это может быть? где бы подробнее почитать?

смотрел исходники CrashRpt, там тоже используется SetUnhandledExceptionFilter помимо прочего.
Re: почему может не ловить краши UnhandledExceptionFilter?
От: EreTIk EreTIk's Box
Дата: 04.07.17 09:27
Оценка:
ksd>Ситуация такая: прога написана на C++ в MS VS. Иногда вылетает окно о GPF, запись в системном журнале есть. В проге делается SetUnhandledExceptionFilter, где в обработчике должен бы создаваться минидамп:
ksd><...>
ksd>однако что то никак дампов не создается, т.е. не попадает в SEHandler: что это может быть? где бы подробнее почитать?

ksd>смотрел исходники CrashRpt, там тоже используется SetUnhandledExceptionFilter помимо прочего.


Из личного опыта: некоторые DLL, даже предустановленные в системе, сами вызывают SetUnhandledExceptionFilter(...) при своей загрузке. А вызов установленного ранее обработчика (который пишет дампы) в них просто не предусмотрен.

Плюс, если посмотреть SetUnhandledExceptionFilter по исходникам Win2k, то мы увидим обычный try-except вызов в kernel32-враппере нити (BaseThreadStart -> UnhandledExceptionFilter). Из этого следует, что нативные нити им не покрываются. Ну и из предположений:
Re: почему может не ловить краши UnhandledExceptionFilter?
От: okman Беларусь https://searchinform.ru/
Дата: 04.07.17 09:36
Оценка: +1
Здравствуйте, ksd, Вы писали:

ksd>однако что то никак дампов не создается, т.е. не попадает в SEHandler: что это может быть? где бы подробнее почитать?


SetUnhandledExceptionFilter ловит не все.
Полезно еще, к примеру, поставить обработчик _set_invalid_parameter_handler и другие.
Вот список (возможно, не полный):

signal
_set_invalid_parameter_handler
_set_purecall_handler
set_unexpected
set_terminate

Причем set_unexpected и set_terminate нужно делать отдельно для каждого своего потока.

----

Ну а еще может не работать потому, что кто-то другой сделал SetUnhandledExceptionFilter/AddVectoredExceptionHandler.
Или "замаскировал" ошибку внутри __try/__except.
Re: почему может не ловить краши UnhandledExceptionFilter?
От: ononim  
Дата: 04.07.17 09:41
Оценка:
UnhandledExceptionFilter не вызывается в случае проблем со стеком, а так же в случае проблем с хипом если установлен HeapSetInformation(...HeapEnableTerminationOnCorruption...). Причем я видел как ентот HeapEnableTerminationOnCorruption самовольно устанавливала какая-то версия msxml.
Вообще этот фильтр — штука ненадежная, и еще — если им и пользоваться — то максимально "тонкий" код в нем писать, а сдампливание вынести например в другой процесс.
Как много веселых ребят, и все делают велосипед...
Отредактировано 04.07.2017 9:42 ononim . Предыдущая версия .
Re: почему может не ловить краши UnhandledExceptionFilter?
От: кт  
Дата: 04.07.17 13:11
Оценка:
Здравствуйте, ksd, Вы писали:

ksd>однако что то никак дампов не создается, т.е. не попадает в SEHandler: что это может быть? где бы подробнее почитать?


вот тут были преведены некоторые детали

http://files.rsdn.org/122727/pl1ex21.doc
Re: почему может не ловить краши UnhandledExceptionFilter?
От: _Butch_  
Дата: 04.07.17 13:24
Оценка:
Здравствуйте, ksd, Вы писали:

ksd>однако что то никак дампов не создается, т.е. не попадает в SEHandler: что это может быть? где бы подробнее почитать?


Может, просто MiniDumpWriteDump не срабатывает.

MiniDumpWriteDump should be called from a separate process if at all possible, rather than from within the target process being dumped. This is especially true when the target process is already not stable. For example, if it just crashed. A loader deadlock is one of many potential side effects of calling MiniDumpWriteDump from within the target process.

Re: почему может не ловить краши UnhandledExceptionFilter?
От: _NN_ www.nemerleweb.com
Дата: 20.07.17 09:09
Оценка: 8 (1) +1
Здравствуйте, ksd, Вы писали:

Если хотите дамп, лучшим будет сконфигурировать Windows Error Reporting для этого процесса.
Windows сам соберёт дамп как надо.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: почему может не ловить краши UnhandledExceptionFilter?
От: okman Беларусь https://searchinform.ru/
Дата: 20.07.17 09:23
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, ksd, Вы писали:


_NN>Если хотите дамп, лучшим будет сконфигурировать Windows Error Reporting для этого процесса.

_NN>Windows сам соберёт дамп как надо.

Или так (работает с Vista SP1 и выше):

Collecting User-Mode Dumps
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspx
Re[3]: почему может не ловить краши UnhandledExceptionFilter?
От: _NN_ www.nemerleweb.com
Дата: 20.07.17 09:30
Оценка:
Здравствуйте, okman, Вы писали:

O>Collecting User-Mode Dumps

O>https://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspx

Оно и есть HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: почему может не ловить краши UnhandledExceptionFilter?
От: rm822 Россия  
Дата: 20.07.17 19:52
Оценка:
Ну так а что ты хотел собстенно
а) нет защиты от рекурсии. При любой фигне твоя функция впадет в рекурсию и умрет на SO
б) если MiniDumpWriteDump ничего не сделал ты возвращаешь EXCEPTION_CONTINUE_SEARCH, поиск идет дальше и логично уходит в систему
в) какая-то дллина установила свой обработчик.
потом ты поставил свой.
а потом она выгрузилась и восстановила системный
а потом крэш
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.