Как сделать паузу Visual Studio после выполнения консольного приложения в режиме отладки?



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



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



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



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



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

1292   16  

16 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В Boost.Тест есть то --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

вы говорите, что не хотите использовать 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);

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

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

Примечание: реализация программы system() в Microsoft Visual Studio требует, чтобы переменная среды COMSPEC идентифицировала интерпретатор командной строки. Если эта переменная среды будет испорчена - например, если у вас возникла проблема в Visual Studio отладочные свойства проекта, чтобы переменные среды не передавались должным образом при запуске программы-тогда он просто не будет работать молча.

на самом деле это было бы больше усилий, но вы могли бы просто построить VS.Net, запустите его из обычной командной строки (cmd.exe), а затем присоединить к процессу после его запуска. Это, вероятно, не то решение, которое вы ищете, однако.

или вы можете использовать выход журнала тестирования boost_test."

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

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

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

включить :

clock_t wait;

wait = clock();
while (clock() <= (wait + 5000)) // Wait for 5 seconds and then continue
    ;
wait = 0;

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

Я запускаю приложение с F11 и получаю точку останова где-то в unit_test_main.ИПП (может быть ассемблерный код). Я использую shift-f11 (Step out) для запуска модульного теста и получения следующей инструкции по сборке в CRT (обычно в mainCRTStartup()). Я использую F9, чтобы установить точку останова на инструкции.

при следующем вызове я могу запустить приложение с помощью F5, и приложение сломается после запуска тестов, поэтому у меня есть возможность заглянуть в окно консоли

добавление следующей строки сделает простой MS-DOS pause показывать сообщение.

system("pause >nul | set /p \"=\"");

и нет никакой необходимости Ctrl+F5 (что заставит ваше приложение работать в режиме выпуска)

просто используйте библиотеку журналов, например log4net, и пусть она войдет в приложение для файлов.

сделайте readline в конце (это "forma cochina", как мы говорим в Колумбии, но это работает):

static void Main(string[] args)
{
    .
    .
    .
    String temp = Console.ReadLine();
}

Comments

    Ничего не найдено.