Process.WaitForExit не запускается с помощью __debugbreak - PullRequest
3 голосов
/ 29 марта 2010

Я пытаюсь написать программу для проверки студенческого кода на предмет хорошей реализации. У меня есть консольное приложение C ++, которое будет запускать один тест за раз, определяемый аргументами командной строки, и приложение форм C # .net, которое вызывает приложение c ++ один раз для каждого теста. Цель состоит в том, чтобы иметь возможность обнаруживать не только прохождение / неудачу для каждого теста, но также «бесконечный» (> 5 сек) цикл и исключения (их код умирает по любой причине).

Проблема в том, что не все ошибки убивают приложение C ++. Если они испортили кучу, система вызывает __debugbreak, и появляется окно с сообщением об ошибке отладки! Обнаружена ошибка кучи ... Мое приложение на C # использует Process.WaitForExit (5000) для ожидания, но эта ошибка не считается выходом, поэтому я вижу тайм-аут.

Итак, мой вопрос: как мне заставить приложение C # обнаружить, что это ошибка, ИЛИ как заставить приложение C ++ умереть при возникновении этой ошибки, вместо того, чтобы давать диалоговое окно и спрашивать, хочу ли я отладить

Edit:
Вот всплывающая ошибка: Ошибка отладки

Вот обычное диалоговое окно сбоя приложения, которое появляется, если я нажимаю «Повторить» в предыдущем диалоговом окне: Ошибка Windows . Опция отладки пропадает, если вы выключаете отладчик JIT.

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Вы должны отключить отладку JIT, на этой странице есть инструкции по ее включению или выключению.

Редактировать Вы также можете использовать функции _CrtSetReportMode и _CrtSetReportFile внутри программы C ++ для изменения поведения отладочных утверждений (в частности, вы можете использовать _CRTDBG_MODE_FILE, чтобы записать содержимое сообщения в файл, а не выводить диалоговое окно.

Если вы компилируете программу как часть своих тестов, то вы можете просто добавить свой собственный файл .cpp, который включает в себя глобальный класс, который выполняет работу в своем конструкторе. Примерно так:

// AssertModify.cpp
class AssertModify
{
public:
    AssertModify()
    {
        ::_CrtSetReportMode(...);
        ::_CrtSetReportFile(...);
    }
};

AssertModify am;

Это приведет к запуску кода до ввода main(), который должен отразить все возможные случаи (кроме случаев, когда студент самостоятельно переопределяет ваше значение, но вы можете добавить проверку любых вызовов на _CrtSetReportMode в представленном им коде до того, как Вы компилируете это)

0 голосов
/ 29 марта 2010

Я думаю, вам нужно скомпилировать приложение C ++ в режиме "релиз". Вы, вероятно, используете "отладочные" сборки, которые включают утверждения. Эти утверждения появляются во всплывающих сообщениях, которые вы видите.

Поскольку вы хотите отлавливать ошибки утверждений, вы можете либо изменить код при его компиляции (как подсказывает кодека), либо запустить программы в отладчике. Не так сложно превратить приложение C # в отладчик, используя Оболочку Майка Сталла , но это не совсем простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...