webentwicklung-frage-antwort-db.com.de

Wie halte ich Visual Studio nach dem Ausführen einer Konsolenanwendung im Debug-Modus an?

Ich habe eine Sammlung von Boost-Unit-Tests, die ich als Konsolenanwendung ausführen möchte.

Wenn ich an dem Projekt arbeite und die Tests durchführe, möchte ich die Tests debuggen können und die Konsole soll nach den Tests geöffnet bleiben.

Ich sehe, dass das Konsolenfenster beim Ausführen im Release-Modus nach dem Beenden des Programms geöffnet bleibt, im Debug-Modus ist dies jedoch nicht der Fall.

Ich möchte nicht hinzufügen "System (" Pause ");" oder andere Hacks wie das Lesen eines Zeichens in meinem Programm. Ich möchte Visual Studio nur anhalten lassen, nachdem ich die Tests mit dem Debuggen ausgeführt habe, wie es der Fall wäre, wenn ich im Release-Modus ausgeführt würde. Ich würde es auch mögen, wenn die Ausgabe von Tests in einem der Ausgabefenster von Visual Studio erfasst würde, aber das scheint auch schwieriger zu sein, als es sein sollte.

Wie kann ich das machen?

61
Jason Dagit

Boost-Test bietet die folgenden Verwendungsempfehlungen für Visual Studio , mit denen Sie die Komponententests am Ende der Kompilierung automatisch ausführen und die Ausgabe im Erstellungsfenster erfassen können.

Der nette Nebeneffekt dieses Tricks ist, dass Sie Testfehler als Kompilierungsfehler behandeln können. "... Sie können diese Fehler mit den üblichen Tastenkombinationen/Mausklicks umgehen, die Sie für die Analyse von Kompilierungsfehlern verwenden ..."

19
Raz

Versuchen Sie, die Anwendung mit der auszuführen Ctrl + F5 Kombination.

121
Cichy

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

In den älteren Versionen wird standardmäßig das Konsolensubsystem verwendet, auch wenn Sie "leeres Projekt" ausgewählt haben, jedoch nicht in 2010, sodass Sie es manuell festlegen müssen. Wählen Sie dazu das Projekt im Projektmappen-Explorer rechts oder links aus (wahrscheinlich ist es bereits ausgewählt, damit Sie sich darüber keine Gedanken machen müssen). Wählen Sie dann "Projekt" aus den Dropdown-Menüs der Menüleiste und anschließend " Projektname Eigenschaften"> "Konfigurationseigenschaften"> "Linker"> "System". und setzen Sie die erste Eigenschaft, die Dropdown-Eigenschaft "subsystem", auf "console (/ SUBSYSTEM: CONSOLE)". Das Konsolenfenster sollte nun nach der Ausführung wie gewohnt geöffnet bleiben.

74
Kirill Golikov

Setzen Sie einen Haltepunkt in der letzten Codezeile.

10
Kevin Timmerman

Ich habe gerade kopiert von http://social.msdn.Microsoft.com/forums/en-US/Vsexpressvc/thread/1555ce45-8313-4669-a31e-b95b5d28c787/?prof=required :

Folgendes funktioniert bei mir :-)

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

Hier ist ein weiterer Grund, warum die Konsole möglicherweise nicht mehr angezeigt wird. Und die Lösung:

Mit dem neuen Visual Studio 2010 wird dieses Verhalten möglicherweise auch dann angezeigt, wenn Sie es verwenden Ctrl + F5 aka "ohne Debuggen starten". Dies liegt wahrscheinlich daran, dass Sie ein "leeres Projekt" anstelle einer "Win32-Konsolenanwendung" erstellt haben. Wenn Sie das Projekt als "Win32-Konsolenanwendung" erstellen, können Sie dies ignorieren, da dies nicht zutrifft.

In älteren Versionen wird standardmäßig das Konsolensubsystem verwendet, auch wenn Sie "leeres Projekt" ausgewählt haben, jedoch nicht in Visual Studio 2010, sodass Sie es manuell festlegen müssen. Wählen Sie dazu das Projekt im Projektmappen-Explorer rechts oder links aus (wahrscheinlich ist es bereits ausgewählt, damit Sie sich darüber keine Gedanken machen müssen).

Wählen Sie dann "Projekt" aus den Dropdown-Menüs der Menüleiste und wählen Sie dann " Projektname Eigenschaften" → "Konfigurationseigenschaften" → "Linker" → "System" und setzen Sie die erste Eigenschaft, die Dropdown-Eigenschaft "subsystem", auf "console (/ SUBSYSTEM: CONSOLE)". Das Konsolenfenster sollte nun nach der Ausführung wie gewohnt geöffnet bleiben.

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

8
Ming

Wenn es sich um eine Konsolenanwendung handelt, verwenden Sie Ctrl + F5.

5
delhister

In Boost.Test gibt es das --auto_start_dbg Parameter für den Einbruch in den Debugger, wenn ein Test fehlschlägt (bei einer Ausnahme oder bei einem Assertionsfehler). Aus irgendeinem Grund funktioniert es bei mir nicht.

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

Aus diesem Grund habe ich meinen benutzerdefinierten test_observer erstellt, der bei einem Assertionsfehler oder einer Ausnahme in den Debugger einbricht. Dies ist bei Debugbuilds aktiviert, wenn wir unter einem Debugger arbeiten.

In eine der Quelldateien meiner Unit-Test-EXE-Datei habe ich folgenden Code eingefügt:

#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
razzmatazz

Sie sagen, Sie möchten den Hack system("pause") nicht verwenden. Warum nicht?

Wenn Sie nicht möchten, dass das Programm eine Eingabeaufforderung ausgibt, wenn kein Debugging durchgeführt wird, können Sie dies umgehen. Das funktioniert bei mir:

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);

Ich füge diesen Code einfach in jede neue Konsolenanwendung ein, die ich schreibe. Wenn das Programm in einem Befehlsfenster ausgeführt wird, ist die Cursorposition nicht <0,0> und es wird nicht atexit() aufgerufen. Wenn es von Ihrem Debugger (einem beliebigen Debugger) aus gestartet wurde, ist die Position des Konsolencursors <0,0> und der Aufruf atexit() wird ausgeführt.

Ich habe die Idee von einem Beispielprogramm, das sich früher in der MSDN-Bibliothek befand, aber ich denke, es wurde gelöscht.

ANMERKUNG: Die Microsoft Visual Studio-Implementierung der Routine system () erfordert die Umgebungsvariable COMSPEC, um den Befehlszeileninterpreter zu identifizieren. Wenn diese Umgebungsvariable durcheinander gerät, z. B. wenn Sie ein Problem mit den Debugeigenschaften des Visual Studio-Projekts haben, sodass die Umgebungsvariablen beim Starten des Programms nicht ordnungsgemäß weitergegeben werden, schlägt dies im Hintergrund fehl .

3
Die in Sente

Oder Sie könnten boost_test "Test Log Output" verwenden.

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

Dann spielt es keine Rolle, ob das Konsolenfenster überhaupt angezeigt wird, UND Ihre Build-Protokollierung kann die Ausgabe der Komponententests als Artefakt für die Prüfung fehlgeschlagener Builds beibehalten.

1
dexblack

Ich würde einen "Warte" -Befehl für eine bestimmte Zeit (Millisekunden) Ihrer Wahl verwenden. Die Anwendung wird bis zu der zu untersuchenden Zeile ausgeführt und nach Ablauf der Zeit fortgesetzt.

Umfassen die <time.h> Header:

clock_t wait;

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

Eigentlich wäre es aufwändiger, aber Sie könnten einfach VS.Net erstellen, es über die reguläre Befehlszeile (cmd.exe) ausführen und es dann an den Prozess anhängen, nachdem es gestartet wurde. Dies ist jedoch wahrscheinlich nicht die Lösung, nach der Sie suchen.

1
Kibbee

Verwenden Sie einfach eine Protokollierungsbibliothek wie log4net und lassen Sie sie in einem Dateianhang protokollieren.

0
Bob King

Ich starte die App mit F11 und erhalte irgendwo in unit_test_main.ipp einen Haltepunkt (kann Assembly-Code sein). Ich benutze shift-f11 (Step out), um den Unit-Test auszuführen und die nächste Assembly-Anweisung im CRT abzurufen (normalerweise in mainCRTStartup ()). Ich benutze F9, um an dieser Anweisung einen Haltepunkt zu setzen.

Beim nächsten Aufruf kann ich die App mit F5 starten und die App wird nach dem Ausführen der Tests unterbrochen, sodass ich einen Blick auf das Konsolenfenster werfen kann

0
Amanjit Gill

Sie können Ihre ausführbare Datei auch als externes Tool einrichten und das Tool für Ausgabefenster verwenden markieren. Auf diese Weise wird die Ausgabe des Tools in Visual Studio selbst und nicht in einem separaten Fenster angezeigt.

0
Andrew

Das Hinzufügen der folgenden Zeile führt zu einem einfachen MS-DOS pause, das keine Meldung anzeigt.

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

Und das ist nicht nötig Ctrl+F5 (Dadurch wird Ihre Anwendung im Freigabemodus ausgeführt.)

0
zurfyx