Возможна ли замена всех стандартных диалогов об ошибках на отладочные или прерывания? - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы заменить любое стандартное диалоговое окно с ошибкой на throw или debug-break (со стандартным я имею в виду все, что не написано мной явно), поскольку, как и в описанном разделе причин,это иногда приводило бы к невозможности отладки Windows-службы.

для этого я попытался определить что-то вроде:

-D "_HAS_ITERATOR_DEBUGGING=0"

, но выше просто отключил диалоги ошибок ина самом деле этого недостаточно, чтобы отследить проблемы, поэтому я бы хотел, чтобы он показывал throw-exception или debug-break вместо отображения диалогового окна с ошибкой.

Есть ли что-то еще, что вы бы мне предложили определить или сделать?

Причина:

При разработке службы Windows у меня были трудные времена, чтобы найти ошибку, которая приводила к сбою сервера:

Воспроизвести:

запустив ниже службу (скомпилированную в режиме отладки) вы можете воспроизвести эту проблему:

#include <unordered_map>

// will cause crash by trying to increment iterator pointing to end
inline static void simulateCrash() {
    typedef std::unordered_map<quint32, quint32> Hash;
    Hash list;
    list[0xC001] = 0xDEAD;
    Hash::iterator it = list.begin();
    it = list.erase(it);
    ++it; // should crash here
}

1 Ответ

0 голосов
/ 27 февраля 2019

Возможно, вы захотите использовать _set_invalid_parameter_handler для перезаписи обработчика по умолчанию, который завершает программу и отображает сообщение об ошибке во время выполнения.

_CrtSetReportMode также полезночтобы избежать диалога с _CrtDbgReport (используется в нескольких проверках).

...