wake-up-neo.com

Wie kann ich qDebug-Meldungen sehen, während ich in QtCreator debugge?

Ich mache den Übergang von Eclipse CDT (mit Qt-Integrations-Plugin) zu QtCreator 2.0, aber es gibt noch eine Sache, die mich mit QtCreator stört:

Wenn ich in QtCreator debugge, sehe ich meine qDebug-Meldungen erst im Application output tab, wenn ich die Anwendung stoppe, die ich debugge ... Dann werden alle auf einmal angezeigt, was nicht sehr nützlich ist.

Mit Eclipse habe ich dieses Problem nicht: Die qDebug-Meldungen werden korrekt angezeigt, wenn sie beim Durchlaufen des Quellcodes auftreten.

Ich verwende sowohl Eclipse CDT als auch Qt Creator unter Windows. Ich habe es nicht unter Linux versucht (was momentan keine Option ist).

14
Etienne Savard

Obwohl dies keine vollständige Antwort ist, können Sie DebugView (Wenn Sie sich auf einem XP Computer befinden) installieren, um die qDebug-Ausgabe anzuzeigen, während Sie versuchen, dies herauszufinden.

Eine andere Lösung, die man als Hack bezeichnen kann, funktioniert aber ganz gut, indem man einfach selbst die Debug-Meldungen hijackt:

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <iostream>

void msgHandler( QtMsgType type, const char* msg )
{
    const char symbols[] = { 'I', 'E', '!', 'X' };
    QString output = QString("[%1] %2").arg( symbols[type] ).arg( msg );
    std::cerr << output.toStdString() << std::endl;
    if( type == QtFatalMsg ) abort();
}

int main(int argc, char *argv[])
{
    qInstallMsgHandler( msgHandler );
    QCoreApplication a(argc, argv);

    qDebug() << "Hello world.";
    qWarning() << "Uh, oh...";
    qCritical() << "Oh, noes!";
    qFatal( "AAAAAAAAAH!" );

    return a.exec();
}

Welches würde ausgeben:

[I] Hello world. 
[E] Uh, oh... 
[!] Oh, noes! 
[X] AAAAAAAAAH!

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Dies ist eigentlich eine Modifikation eines Codes, den ich selbst benutze, um qDebug, qWarning usw. an eine Protokolldatei zu senden.

12
kurige

Sie müssen nicht schließen die Anwendung, um qDebug()-Nachrichten anzuzeigen.

Ganz unten im Qt Creator befindet sich eine Registerkarte mit dem Namen 3 - Application output. Wenn Sie auf dieses Fenster klicken, wird das Anwendungsausgabefenster unten in Qt Creator angezeigt.

In diesem bestimmten Fenster werden die Nachrichten qDebug() angezeigt, sobald sie aufgerufen werden, während die Anwendung noch ausgeführt wird.

Ich hoffe es hilft.

Bearbeiten:

Ich bin nicht sicher, ob dies eine Antwort ist, aber es könnte eine gute berechtigte Ursache sein.

From qDebug () documentation,

Die Qt-Implementierung dieser Funktionen druckt den Text in die stderr-Ausgabe unter Unix/X11 und Mac OS X. Wenn es sich bei Windows um eine Konsolenanwendung handelt, wird der Text an die Konsole gesendet. Andernfalls wird es wird an den Debugger gesendet.

Jetzt hat Qt Creator keinen eigenen Debugger mehr.

Ab Qt Creator Dokumentation müssen wir den Debugger manuell installieren. Da Sie Windows verwenden, müssen Sie Debugging-Tools für Windows manuell installieren. Weitere Dokumentation finden Sie hier ...

Obwohl ich nicht an Eclipse CDT gewöhnt bin, ist nehme ich an möglicherweise ein Debugger angeschlossen, der die Debugging-Ausgabe korrekt anzeigt.

Da dem Qt Creator kein Debugger zugeordnet ist, verhält er sich möglicherweise seltsam.

Probieren Sie es einfach aus ..

7
liaK

Um die obigen Antworten hinzuzufügen ..

Stellen Sie immer sicher, dass Sie im debug-Modus und nicht im release-Modus erstellen. Funktioniert wie qDebug() nur mit dem Debugbuild.

Dies war der dumme Fehler, den ich gemacht habe, bevor meine Suche nach dem mich hierher führte, und ich wollte diesen feinen, aber wichtigen Punkt in die Liste der anderen Antworten aufnehmen.

2
CodeCrusader

Haben Sie versucht, die folgende Zeile zu Ihrer .pro-Datei hinzuzufügen?

OUTPUT + = Konsole

Dann können Sie auf std :: cout ausgeben.

1
Live

Lass mich dir etwas erzählen:

Einmal habe ich eine C++ - Konsolenanwendung unter Linux entwickelt. Während der Ausführung der Anwendung wurde eine Datei gelesen und die Verarbeitung einer bestimmten Logik gestartet, indem einige Statusmeldungen ausgedruckt wurden. Als ich diese Anwendung ausführte, war die Ausgabe in Ordnung. Um das Debuggen zu vereinfachen, habe ich beschlossen, die Anwendung folgendermaßen auszuführen:

./a.out |& tee log

Dieser Befehl leitet die Standardausgabe (möglicherweise auch ein Standardfehler, an den ich mich nicht erinnere) in eine Datei namens "log" um. Als ich mit dieser Option lief, sah ich, dass es genau so in die Protokolldatei schreibt wie in std out, nur dass es einige Verschiebungen wie diese gibt:

in std out - gewünschte Ausgabe

A
operation 1 success
B
operation 2 success
C
operation 3 success
D
operation 4 success

In der Protokolldatei - Ausgabe mit Verschiebung (dies ist nicht korrekt)

A
B
C
D
operation 1 success
operation 2 success
operation 3 success
operation 4 success

Ich schätze, Ihr Problem ist eines dieser ... Ich habe mir QDebug angesehen und keine Funktion gesehen, die den Puffer freigibt (so etwas wie eine Operation namens Flush). Ich empfehle Ihnen daher, Ihre Zeit nicht auf diese Art von kleinen Problemen zu verwenden (ich denke auch, dass Qt Creator 2.0 als Beta-Version veröffentlicht wird und möglicherweise ein Fehler auftritt) und eine der folgenden Methoden zu verwenden:

qFatal()
qCritical()
qWarning()
QMessageBox

Ich persönlich benutze QMessageBox :: about, um zu debuggen, da Sie den Screan stoppen und den Wert an einer sehr nützlichen Stelle lesen können, die Sie mit dem Debugger nicht können (ich meine, Sie können, aber Sie können den aktuellen Status Ihrer GUI nicht sehen) Anwendung als Debugger haben die Kontrolle übernommen).

Hoffnung hilft.

1
Narek

Dies ist eine Problemumgehung, aber Sie könnten wahrscheinlich Ihren eigenen Nachrichtenhandler installieren. Schauen Sie sich qInstallMsgHandler in der Dokumentation an, falls Sie dies noch nicht getan haben.

Ich habe ein ähnliches Problem unter Ubuntu 9.10 mit Qt Creator 2.0 und Qt 4.7.0, obwohl ich keine Standardausgabe sehe, bis die Anwendung geschlossen wird. Es ist, als würde der Puffer nicht geleert. Beim Drucken auf stderr wird die Ausgabe jedoch sofort im Ausgabefenster der Anwendung angezeigt.

fprintf(stderr, "Test1 \n"); // Prints immediately
fprintf(stderr, "Test2 \n\r"); // Prints immediately
fprintf(stdout, "Test3 \n"); // Delayed until app termination
fprintf(stdout, "Test4 \n\r"); // Delayed until app termination
qDebug() << "Test6 \n\r"; // Does not print at all
0
fejd

Keine dieser Antworten stimmte für mich (Arch Linux-Benutzer). Anstatt zu versuchen, meine Probleme zu erklären, ist hier eine .pro-Datei, die funktioniert hat. Ich benutze nicht die QT-Thread-Schleife, sondern nur ein einfaches main (), das Sachen macht und existiert. Ich benutze cout für meine Ausgabe:

QT += core
QT -= gui

CONFIG += c++14

TARGET = evo
#CONFIG += console
CONFIG -= app_bundle
#CONFIG += qt

#OUTPUT += console

TEMPLATE = app

SOURCES += main.cpp \
    individual.cpp \
    node.cpp \
    tree.cpp

HEADERS += \
    individual.h \
    node.h \
    tree.h
0
Luke Dupin