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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Я просто скопировал из 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)". Окно консоли должно оставаться открытым после выполнения, как обычно.

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

Ответ 6

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

Ответ 7

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

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

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, чтобы переменные среды не были должным образом переданы при запуске программы - тогда она просто терпит неудачу.

Ответ 8

В 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, который будет разбиваться на отладчик при наличии ошибки утверждения или исключения. Это включено в отладочные сборки, когда мы запускаемся под отладчиком.

В одном из исходных файлов моего unit test 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

Ответ 9

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

Ответ 10

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

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

clock_t wait;

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

Ответ 11

Или вы можете использовать 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

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

Ответ 12

Просто используйте библиотеку протоколирования, такую ​​как log4net, и зарегистрируйте ее в файл-приложении.

Ответ 13

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

Ответ 14

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

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

Ответ 15

Добавление следующей строки сделает простой MS-DOS pause, не отображающий сообщения.

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

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

Ответ 16

Прочитайте в конце (это "форма кочина", как мы говорим в Колумбии, но она работает):

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