wo finde ich Konsolenausgaben während Debugging?



  • Hi,
    ich habe mit C++Builder (Embarcadero) ein Konsolenprogramm erstellt, welches diverse printf()-Ausgaben macht.
    Zum Debuggen starte ich das Programm natürlich aus der IDE, aber ich sehe keine Ausgaben. Beim Start aus einem Konsolenfenster kommen die Ausgaben natürlich auch dort an, aber beim Debuggen?

    Irgendwie fehlt der IDE ein Konsolenfenster. Wie bekomme ich so etwas?



  • Also bei Start aus Visual Studio heraus wird brav ein Konsolenfenster aufgemacht -- sofern das Programm als "Subsystem" Konsole eingestellt hat. Ob das "Subsystem" richtig eingestellt ist kannst du ganz einfach testen: Bau ein "Sleep(1000);" in dein Programm ein, kompiliere es und starte es dann aus der Konsole. Wenn du sofort wieder den Prompt bekommst dann passt es nicht. Wenn es eine Sekunde dauert bevor du wieder nen Prompt bekommst, dann passt es. Wenns daran liegt: einfach googeln wie du das in C++ Builder umstellst und ... umstellen 🙂

    Ansonsten könnte es noch sein dass C++ Builder Konsoleninput und -output umleitet und in einem Fenster/Tab in der IDE anzeigt bzw. von dort einliest.



  • @hustbaer sagte in wo finde ich Konsolenausgaben während Debugging?:

    Bau ein "Sleep(1000);" in dein Programm ein, kompiliere es und starte es dann aus der Konsole. Wenn du sofort wieder den Prompt bekommst dann passt es nicht.

    warum passiert das?



  • @Bushmaster Aus Windows Internals, 4th Edition, Chapter 2: System Architecture p53:

    Each executable image (.exe) is bound to one and only one subsystem. When an image is run, the process creation code examines the subsystem type code in the image header so that it can notify the proper subsystem of the new process. This type code is specified with the /SUBSYSTEM qualifier of the link command in Microsoft Visual C++ and can be viewed with the Exetype tool in the Windows resource kits.

    Das ist aber nur die halbe Geschichte. "Console" ist kein "echtes" Subsystem (wie ehemals OS2 oder Posix oder heute WSL) sondern gehört zum Windows-Subsystem. CreateProcess() wird für eine .exe mit entsprechendem Flag im MZ-Header nachsehen ob der Parent eine Console Host (conhost.exe) ist, wenn ja die Standardeingabe und -ausgabe entsprechend umleiten und warten bis das Programm terminiert. Sonst, wenn der Parent nicht schon ein Console Host ist erübrigt sich die Frage warum Conhost wartet weil es dann ja keinen bereits laufenden command processor gibt der nach Ausführung des neuen Childs weiterlaufen sollte (da kommt dann die beliebte Frage warum sich denn das Konsolenfenster schließt bevor man die Ausgabe lesen konnte).

    Detaillierter muss Dir das jemand beantworten der zugang zum Source hat.
    Windows Command-Line: Inside the Windows Console ist nett zu lesen.


  • Gesperrt

    Es ist auch möglich Konsole "manuell" zu öffnen, siehe z.B. https://smacdo.com/programming/redirecting-standard-output-to-console-in-windows/



  • @titan99_ Steht halt da in Deinem Link nirgends daß man das mit AllocConsole() macht.


  • Gesperrt

    @Swordfish sagte in wo finde ich Konsolenausgaben während Debugging?:

    @titan99_ Steht halt da in Deinem Link nirgends daß man das mit AllocConsole() macht.

    Also der Funktionsaufruf steht in der 2. Zeile im Codebeispiel. Ist aber Teil der WinAPI und funktioniert deshalb nur mit Windows, soweit ich weiss.



  • Es gibt auch beim C++ Builder (bez. RADStudio) ein Ausgabe-Fenster ("output window") als Tab in der IDE.



  • @Th69 sagte in wo finde ich Konsolenausgaben während Debugging?:

    Es gibt auch beim C++ Builder (bez. RADStudio) ein Ausgabe-Fenster ("output window") als Tab in der IDE.

    Ja, genau das suche ich.
    Nach Start im Debug-Modus erscheint unterhalb des Codefensters ein freier Bereich quer über den ganzen Bildschirm. Dort erscheinen jedoch keine printf()-Ausgaben.
    Weder im Menue "Fenster" noch im Menue "Ansicht" gibt es ein "output Window".

    Wie kann ich also das "output window" auf meinen Bildschirm bringen?



  • @titan99_ sagte in wo finde ich Konsolenausgaben während Debugging?:

    Also der Funktionsaufruf steht in der 2. Zeile im Codebeispiel.

    Dann sorry, weiß nicht warum das bei mir die Seitensuche nicht gefunden hat (oder ich habe mich beim Suchen vertippt ^^).



  • Welche Version vom C++Builder hast du denn? Und was für einen Projekttyp verwendest du?

    Einen Screenshot habe ich gefunden: C++ Builder 10.1 Android Compile Error: type_traits file not found -> unten der Tab "Output" (sollte aber auch bei anderen C++Builder-Versionen und Projekttypen erscheinen bzw. sich über das Menü aktivieren lassen).



  • @Th69 sagte in wo finde ich Konsolenausgaben während Debugging?:

    Welche Version vom C++Builder hast du denn? Und was für einen Projekttyp verwendest du?

    Ich habe C++Builder 10.2 Version 25.0.31059.323, Update 3.
    Er läuft unter Win10, 64bit.

    Einen Screenshot habe ich gefunden: C++ Builder 10.1 Android Compile Error: type_traits file not found -> unten der Tab "Output" (sollte aber auch bei anderen C++Builder-Versionen und Projekttypen erscheinen bzw. sich über das Menü aktivieren lassen).

    Leider erscheint bei mir der Tab "Output" nicht.

    Allerdings wird beim Start im Debug-Mode ein Kommandofenster mit Titel "Eingabeaufforderung" erzeugt. Dort tauchen aber auch keine printf()-Ausgaben auf.
    Wenn ich wüsste, wie man hier ein Bild anhängt, dann würde ich einen Screenshot dranhängen.



  • @Niko99
    Nachtrag:
    Wenn ich das Programm im Fenster "Eingabeaufforderung" starte, dann erscheinen dort alle printf()-Ausgaben. Aber dann läuft das Programm einfach durch, ohne Debug-Möglichkeit.

    Wenn ich das Programm im Debug-Mode einfach durchlaufen lasse, dann erscheint nach Abschluss des Programms unten in der IDE ein Fenster "Meldungen" mit zwei Tabs, "Erzeugen" und "Ausgabe". Aber der Tab "Ausgabe" zeigt nur Meldungen aus dem Build-Vorgang an.

    Wenn ich das Programm im Debug-Mode starte mit einem Breakpoint, dann bleibt das Programm zwar am Breakpoint stehen, aber das Fenster "Meldungen" ist nicht zu sehen!


Anmelden zum Antworten