Windows - Предотвращает катастрофические отказы, “Проверяющие на решение …” и “Перезапускающие программу …”

Я выполнил и GNU emacs и Xemacs на окнах. Я раньше использовал его в качестве моего основного редактора, почтовый клиент и т.д., но не это - "просто" редактор.

, Когда я недавно переустановил к Vista, я установил последнюю версию GNU. Это хорошо работает. Также - Xemacs, но действительно похоже, что GNU имеет их sh*t вместе, таким образом, Xemacs больше не так востребован.

6
задан James Cadd 8 November 2009 в 23:33
поделиться

4 ответа

Хотя Microsoft рекомендует использовать более новую замену API, доступную только в Windows Vista и более поздних версиях, существует API, который работает для всех версий Windows, начиная с XP: AddERExcludedApplication () . Эта функция принимает имя модуля без информации о пути (например, «myprogram.exe»), для которого необходимо отключить создание отчетов об ошибках.

Новый метод, доступный только в Windows Vista и более поздних версиях, заключается в вызове функции WerAddExcludedApplication () . Этот API позволяет указать, следует ли изменять куст реестра HKEY_CURRENT_USER или куст реестра HKEY_LOCAL_MACHINE. Не забудьте установить это для HKCU, если набор HKLM не работает, например:

typedef BOOL (*ADD_MER_EXCLUDED_APP_XP)     (PCWSTR);
typedef BOOL (*ADD_MER_EXCLUDED_APP_VISTA)  (PCWSTR, BOOL);

bool disable_microsoft_error_reporting(PCWSTR wz_app)
{
    const WCHAR * const WZ_MER_DLL_XP       = L"faultrep.dll";
    const char  * const SZ_MER_PROC_XP      = "AddERExcludedApplicationW";

    const WCHAR * const WZ_MER_DLL_VISTA    = L"wer.dll";
    const char  * const SZ_MER_PROC_VISTA   = "WerAddExcludedApplicationW";

    const int   WER_EXCLUDE_FOR_ALL_USERS   = TRUE;
    const int   WER_EXCLUDE_FOR_THIS_USER   = FALSE;

    HANDLE      hlib_error_reports_xp       = NULL;
    HANDLE      hlib_error_reports_vista    = NULL;

    ADD_MER_EXCLUDED_APP_XP     add_mer_excluded_app_xp     = NULL;
    ADD_MER_EXCLUDED_APP_VISTA  add_mer_excluded_app_vista  = NULL;

    bool        success                     = false;

    // First, attempt the API that has been around since XP.
    hlib_error_reports_xp = LoadLibrary(WZ_MER_DLL_XP);

    if (hlib_error_reports_xp)
    {
        add_mer_excluded_app_xp = (ADD_MER_EXCLUDED_APP_XP)GetProcAddress(hlib_error_reports_xp, SZ_MER_PROC_XP);

        if (add_mer_excluded_app_xp)
            success = add_mer_excluded_app_xp(wz_app);

        FreeLibrary(hlib_error_reports_xp);
        hlib_error_reports_xp   = NULL;
        add_mer_excluded_app_xp = NULL;

        if (success)
            return true;
    }

    // That did not succeed.  Attempt the Vista API.
    hlib_error_reports_vista = LoadLibrary(WZ_MER_DLL_VISTA);

    if (hlib_error_reports_vista)
    {
        add_mer_excluded_app_vista = (ADD_MER_EXCLUDED_APP_VISTA)GetProcAddress(hlib_error_reports_vista, SZ_MER_PROC_VISTA);

        if (add_mer_excluded_app_vista)
        {
            success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_ALL_USERS));

            if (!success)
                success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_THIS_USER));
        }   

        FreeLibrary(hlib_error_reports_vista);
        hlib_error_reports_vista    = NULL;
        add_mer_excluded_app_vista  = NULL;

        if (success)
            return true;
    }

    // Nothing worked.  Fail.
    return false;
}

Чтобы еще больше сократить выполнение компонентов WER, реализуйте фильтр необработанных исключений и передайте его: Функция SetUnhandledExceptionFilter () . Чтобы шунтировать WER, ваш фильтр никогда не должен возвращать EXCEPTION_CONTINUE_SEARCH или EXCEPTION_EXECUTE_HANDLER .

Один из недостатков реализации SetUnhandledExceptionFilter () функции Своевременная отладка.

Вы упомянули, что хотите, чтобы приложение было «тихо убито». В этом случае:


LONG WINAPI global_exception_filter(struct _EXCEPTION_POINTERS *exception_info)
{
    ExitProcess(0xDEDD000D);
}


int WINAPI WinMain(
    HINSTANCE _hinstance,
    HINSTANCE hinstance_prev,
    LPSTR sz_cmd_line,
    int cmd_show
)
{
    SetUnhandledExceptionFilter(global_exception_filter);
    /* ... */
}

Заставит приложение немедленно исчезнуть при необработанном исключении. NB, возвращаемый код выхода - дело вкуса.

Один из недостатков реализации функции SetUnhandledExceptionFilter () заключается в том, что она мешает своевременной отладке.

Вы упомянули, что хотите, чтобы приложение было «тихо убито». В этом случае:


LONG WINAPI global_exception_filter(struct _EXCEPTION_POINTERS *exception_info)
{
    ExitProcess(0xDEDD000D);
}


int WINAPI WinMain(
    HINSTANCE _hinstance,
    HINSTANCE hinstance_prev,
    LPSTR sz_cmd_line,
    int cmd_show
)
{
    SetUnhandledExceptionFilter(global_exception_filter);
    /* ... */
}

Приведет к немедленному закрытию приложения при необработанном исключении. NB, возвращаемый код выхода - дело вкуса.

Одним из недостатков реализации функции SetUnhandledExceptionFilter () является то, что она мешает своевременной отладке.

Вы упомянули, что хотите, чтобы приложение было «тихо убито». В этом случае:


LONG WINAPI global_exception_filter(struct _EXCEPTION_POINTERS *exception_info)
{
    ExitProcess(0xDEDD000D);
}


int WINAPI WinMain(
    HINSTANCE _hinstance,
    HINSTANCE hinstance_prev,
    LPSTR sz_cmd_line,
    int cmd_show
)
{
    SetUnhandledExceptionFilter(global_exception_filter);
    /* ... */
}

Приведет к немедленному закрытию приложения при необработанном исключении. NB, возвращаемый код выхода - дело вкуса.

2
ответ дан 17 December 2019 в 07:06
поделиться

Я понимаю, что другие ответили, предлагая способы решения этой проблемы , но ...

Давайте не будем забывать, что лучший способ защититься от этого - написать программу, которая не дает сбоев. :-) Вы не должны этого видеть, если вы правильно используете память и не вешаете поток графического интерфейса.

Изменение поведения при сбое приложения - отличный способ внести незаметные и смертельные ошибки. См. Также это сообщение в блоге Раймонда Чена из Microsoft.

1
ответ дан 17 December 2019 в 07:06
поделиться
0
ответ дан 17 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: