Как заставить Visual Studio приостановить работу после запуска консольного приложения в режиме отладки? - PullRequest
61 голосов
/ 11 октября 2008

У меня есть коллекция модульных тестов Boost, которые я хочу запустить как консольное приложение.

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

Я вижу, что если я запускаю в режиме выпуска, окно консоли остается после выхода из программы, но в режиме отладки это не так.

Я не хочу добавлять 'system ("пауза"); или любые другие хаки, такие как чтение символов в моей программе. Я просто хочу сделать Visual Studio паузой после запуска тестов с отладкой, как если бы я работал в режиме выпуска. Мне также хотелось бы, чтобы результаты тестов были записаны в одном из окон вывода Visual Studio, но это также оказалось сложнее, чем должно быть.

Как я могу это сделать?

Ответы [ 16 ]

120 голосов
/ 14 декабря 2008

Попробуйте запустить приложение с комбинацией Ctrl + F5 .

74 голосов
/ 03 февраля 2012

http://connect.microsoft.com/VisualStudio/feedback/details/540969/missing-press-any-key-to-continue-when-lauching-with-ctrl-f5

В более старых версиях по умолчанию будет использоваться консольная подсистема, даже если вы выбрали «пустой проект», но не в 2010 году, поэтому вам нужно установить его вручную. Для этого выберите проект в обозревателе решений справа или слева (возможно, он уже выбран, поэтому вам не нужно об этом беспокоиться). Затем выберите «проект» из выпадающего меню строки меню, затем выберите « имя_проекта свойства»> «свойства конфигурации»> «компоновщик»> «система» и установите первое свойство, выпадающий «подсистема» свойство "console (/ SUBSYSTEM: CONSOLE)". Окно консоли теперь должно оставаться открытым после выполнения, как обычно.

19 голосов
/ 11 октября 2008

Boost test предлагает следующие рекомендации по использованию Visual Studio , которые позволят вам автоматически запускать модульные тесты в конце компиляции и записывать вывод в окно сборки.

Приятным побочным эффектом этого трюка является то, что он позволяет вам рассматривать неудачи теста как ошибки компиляции. «... вы можете перепрыгнуть через эти ошибки, используя обычные сочетания клавиш / щелчки мыши, которые вы используете для анализа ошибок компиляции ...»

10 голосов
/ 11 октября 2008

Установить точку останова в последней строке кода.

8 голосов
/ 23 февраля 2011

Я только что скопировал с http://social.msdn.microsoft.com/forums/en-US/Vsexpressvc/thread/1555ce45-8313-4669-a31e-b95b5d28c787/?prof=required:

У меня работает следующее: -)

/////////////////////////////////////////////// //////////////////////////////////////

Вот еще одна причина, по которой консоль может исчезнуть. И решение:

В новой Visual Studio 2010 вы можете увидеть это поведение, даже если вы используете Ctrl + F5 aka «запуск без отладки». Это, скорее всего, потому, что вы создали «пустой проект» вместо «консольного приложения Win32». Если вы создаете проект как «консольное приложение Win32», вы можете игнорировать его, так как он не применяется.

В более старых версиях по умолчанию используется консольная подсистема, даже если вы выбрали «пустой проект», но не в Visual Studio 2010, поэтому вам нужно установить его вручную. Для этого выберите проект в обозревателе решений справа или слева (возможно, он уже выбран, поэтому вам не нужно об этом беспокоиться).

Затем выберите «проект» из выпадающего меню строки меню, затем выберите « имя_проекта свойства» → «свойства конфигурации» → «компоновщик» → «система» и установите первое свойство, раскрывающийся свойство "subsystem" для "console (/ SUBSYSTEM: CONSOLE)". Окно консоли теперь должно оставаться открытым после выполнения, как обычно.

/////////////////////////////////////////////// //////////////////////////////////////

5 голосов
/ 14 ноября 2010

Если это консольное приложение, используйте Ctrl + F5 .

3 голосов
/ 03 мая 2011

В Boost.Test есть параметр --auto_start_dbg для взлома отладчика при сбое теста (при исключении или при ошибке подтверждения). По некоторым причинам это не работает для меня.

См. http://www.boost.org/doc/libs/1_40_0/libs/test/doc/html/utf/usage-recommendations/dot-net-specific.html

По этой причине я создал свой собственный test_observer, который будет работать в отладчике при сбое или исключении утверждения. Это включено в отладочных сборках, когда мы работаем под отладчиком.

В один из исходных файлов моего EXE-файла модульного теста я добавил этот код:

#ifdef _DEBUG

#include <boost/test/framework.hpp>
#include <boost/test/test_observer.hpp>

struct BoostUnitTestCrtBreakpointInDebug: boost::unit_test::test_observer
{
    BoostUnitTestCrtBreakpointInDebug()
    {
        boost::unit_test::framework::register_observer(*this);
    }

    virtual ~BoostUnitTestCrtBreakpointInDebug()
    {
        boost::unit_test::framework::deregister_observer(*this);
    }

    virtual void assertion_result( bool passed /* passed */ )
    {
        if (!passed)
            BreakIfInDebugger();
    }

    virtual void exception_caught( boost::execution_exception const& )
    {
        BreakIfInDebugger();
    }

    void BreakIfInDebugger()
    {
        if (IsDebuggerPresent())
        {
            /**
             * Hello, I know you are here staring at the debugger :)
             *
             * If you got here then there is an exception in your unit
             * test code. Walk the call stack to find the actual cause.
             */
            _CrtDbgBreak();
        }
    }
};

BOOST_GLOBAL_FIXTURE(BoostUnitTestCrtBreakpointInDebug);

#endif
3 голосов
/ 26 ноября 2008

Вы говорите, что не хотите использовать хак system("pause"). Почему нет?

Если это потому, что вы не хотите, чтобы программа запрашивала, когда она не отлаживается, есть способ обойти это. Это работает для меня:

void pause () {
    system ("pause");
}

int main (int argc, char ** argv) {
    // If "launched", then don't let the console close at the end until
    // the user has seen the report.
    // (See the MSDN ConGUI sample code)
    //
    do {
        HANDLE hConsoleOutput = ::GetStdHandle (STD_OUTPUT_HANDLE);
        if (INVALID_HANDLE_VALUE == hConsoleOutput)
            break;
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        if (0 == ::GetConsoleScreenBufferInfo (hConsoleOutput, &csbi))
            break;
        if (0 != csbi.dwCursorPosition.X)
            break;
        if (0 != csbi.dwCursorPosition.Y)
            break;
        if (csbi.dwSize.X <= 0)
            break;
        if (csbi.dwSize.Y <= 0)
            break;
        atexit (pause);
    } while (0);

Я просто вставляю этот код в каждое новое консольное приложение, которое пишу. Если программа запускается из командного окна, позиция курсора не будет <0,0>, и она не будет вызывать atexit(). Если он был запущен от вашего отладчика (любого отладчика), позиция курсора консоли будет <0,0> и будет выполнен вызов atexit().

Я получил идею из примера программы, которая раньше была в библиотеке MSDN, но я думаю, что она была удалена.

ПРИМЕЧАНИЕ. Для реализации подпрограммы system () в Microsoft Visual Studio требуется переменная среды COMSPEC для идентификации интерпретатора командной строки. Если эта переменная окружения испорчена - например, если у вас есть проблема в свойствах отладки проекта Visual Studio, из-за которой переменные окружения не передаются должным образом при запуске программы - тогда она просто молча завершится ошибкой .

1 голос
/ 26 октября 2011

Или вы можете использовать boost_test "Test Log Output."

http://www.boost.org/doc/libs/1_47_0/libs/test/doc/html/utf/user-guide/test-output/test-log.html

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

1 голос
/ 16 февраля 2011

Я бы использовал команду "wait" в течение определенного времени (миллисекунды) по вашему выбору. Приложение выполняется до строки, которую вы хотите проверить, а затем продолжается после истечения времени.

Включите заголовок <time.h>:

clock_t wait;

wait = clock();
while (clock() <= (wait + 5000)) // Wait for 5 seconds and then continue
    ;
wait = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...