Как сделать паузу Visual Studio после выполнения консольного приложения в режиме отладки?
У меня есть коллекция модульных тестов Boost, которые я хочу запустить как консольное приложение.
когда я работаю над проектом и запускаю тесты, я хотел бы иметь возможность отлаживать тесты, и я хотел бы, чтобы консоль оставалась открытой после запуска тестов.
Я вижу, что если я запускаю в режиме выпуска, окно консоли остается после выхода программы, но в режиме отладки это не так.
Я не хочу добавлять ' system ("pause"); ' или любые другие хаки как чтение персонажа в моей программе. Я просто хочу сделать паузу Visual Studio после запуска тестов с отладкой, как если бы я работал в режиме выпуска. Мне также хотелось бы, чтобы выходные данные тестов были захвачены в одном из выходных окон Visual Studio, но это также кажется сложнее, чем должно быть.
Как я могу это сделать?
16 ответов:
Boost test предлагает следующее рекомендации по использованию Visual Studio это позволит вам автоматически запускать модульные тесты в конце компиляции и записывать выходные данные в окно сборки.
хороший побочный эффект этого трюка заключается в том, что он позволяет рассматривать ошибки тестирования как ошибки компиляции. "...вы можете перейти через эти ошибки, используя обычные сочетания клавиш / щелчки мыши, которые вы используете для анализа ошибок компиляции..."
в старых версиях он будет по умолчанию для консольной подсистемы, даже если вы выбрали "пустой проект", но не в 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)". В окне консоли должен оставаться открытым после выполнения обычный.
/////////////////////////////////////////////////////////////////////////////////////
В Boost.Тест есть то
--auto_start_dbgпараметр для взлома отладчика при сбое теста (при исключении или сбое утверждения). По какой-то причине это не работает для меня.по этой причине я создал свой пользовательский 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