2010-07-21 11 views
13

estoy haciendo la transición de Eclipse CDT (con Qt plugin de integración) a QtCreator 2.0, pero todavía hay una cosa que me molesta con QtCreator:¿Cómo puedo ver los mensajes qDebug durante la depuración en QtCreator

Cuando depuración en QtCreator, no veo mis mensajes qDebug dentro del Application output tab hasta que detengo la aplicación que estoy depurando ... Luego se muestran todos a la vez, lo cual no es muy útil.

Con Eclipse, no tengo este problema: los mensajes qDebug se muestran correctamente cuando se encuentran al pasar por el código fuente.

Estoy usando Eclipse CDT y Qt Creator en Windows. No lo intenté en Linux (que no es una opción ahora).

+0

¿Qué tipo de aplicación estás creando? GUI o consola? – liaK

+0

Es una aplicación GUI. –

+0

¿De ninguna manera está definiendo QT_NO_DEBUG_OUTPUT? – liaK

Respuesta

12

Aunque no es una respuesta completa, puede instalar DebugView (si está en una máquina con XP) para ver la salida qDebug mientras trata de resolver esto.

Otra solución podría ser considerado como un truco, pero funciona bastante bien, es simplemente secuestrar los mensajes de depuración a sí mismo:

#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(); 
} 

Qué seria:

[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. 

Esto es en realidad una modificación de algunos código que utilizo para enviar qDebug, qWarning, etc., a un archivo de registro.

+0

Lo hago ya en mi aplicación. ¿Puede ser por qué no veo el mensaje en el depurador? Tengo DebugView, pero, si puedo hacer la depuración en Qt Creator sin cambiar entre las dos aplicaciones, es una mejor solución. –

+0

Mi error, estaba usando fprintf (stderr, ... en lugar de std :: cerr. Funciona bien ahora. Gracias. –

6

Usted no tiene que cerrar la aplicación para ver qDebug() mensajes.

Hay una pestaña llamada 3 - Application output en la parte inferior de Qt Creator. Al hacer clic en esa ventana, se mostrará la ventana de salida de la aplicación en la parte inferior de Qt Creator.

Esa ventana en particular mostrará los mensajes qDebug() tan pronto como se llamen mientras la aplicación todavía se está ejecutando.

Espero que ayude.

Editar:

No estoy seguro de si se trata de una respuesta, pero podría ser una buena justificación.

De qDebug() documentación,

La aplicación Qt de estas funciones imprime el texto a la salida stderr bajo Unix/X11 y Mac OS X. Con Windows, si se trata de una aplicación de consola , el texto se envía a la consola ; de lo contrario, se envía al depurador.

Ahora Qt Creator no tiene su propio depurador conectado.

De la documentación Qt Creator, tenemos que instalar manualmente el depurador. Puesto que usted está utilizando Windows, es necesario instalar herramientas de depuración para Windows manualmente .. Más documentación se puede encontrar here ...

Aunque no estoy acostumbrado a Eclipse CDT, Asumo que podría haber un depurador asociado a la misma y, por tanto, muestra la salida de depuración correctamente ..

Dado que no hay un depurador asociado a la Qt Creator, puede ser que sea un comportamiento extraño ..

Sólo darle una oportunidad ..

+0

Gracias por su respuesta, pero no veo nada dentro de la pestaña de salida de la aplicación a menos que detenga el depurador. He actualizado mi pregunta para ser más preciso. –

+0

@esavard, ya que está en Windows, ¿tiene CDB (Depurador de consola de Microsoft) instalado en su máquina? – liaK

+0

Uso MinGW y no el compilador de Microsoft. MinGW viene incluido con Qt 4.6 y también el depurador (gdb). Entonces, no tuve que instalar nada. Sin embargo, tuve que construir la Biblioteca de Debugging Helper para Qt Creator. –

1

¿Ha intentado agregar la siguiente línea a su .pro?

SALIDA + = Consola

A continuación, puede dar salida en std :: cout.

+1

Veo las salidas std :: cout en la pestaña de salida de la aplicación Qt Creator pero no el mensaje qDebug. Si pudiera encontrar una manera de ver ambos, será genial. –

0

Esto es una solución, pero probablemente podría instalar su propio manejador de mensajes. Eche un vistazo a qInstallMsgHandler en la documentación si aún no lo ha hecho.

Tengo un problema similar en Ubuntu 9.10 con Qt Creator 2.0 y Qt 4.7.0, aunque no veo salida stdout hasta que se cierre la aplicación. Es como si el buffer no estuviera enrojecido. Sin embargo, la impresión en stderr muestra el resultado en la ventana de salida de la aplicación.

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 
1

Déjeme decirle algo:

Una vez que he desarrollado una aplicación de consola de C++ en Linux. Durante la ejecución de la aplicación, estaba leyendo un archivo y comenzando a procesar algo de lógica al imprimir algunos mensajes de estado. Cuando ejecuto esa aplicación, la salida fue correcta. Así que para la depuración conveniente he decidido ejecutar la aplicación como esta:

./a.out |& tee log 

Este comando vuelve a dirigir la salida estándar (puede ser también el error estándar que no recuerdo) en un archivo denominado "log". Así que cuando me quedo con esta opción vi que se escribe en el archivo de registro es exactamente el mismo que en std a cabo sólo hay algunos desplazamientos como este:

en std cabo - salida deseada

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

en el archivo de registro - salida con desplazamiento (esto no es correcto)

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

supongo que su problema es este tipo de uno ... he echado un vistazo a QDebug y no tener en sí es cualquier función que libera el búfer (algo así como la operación denominada flush). Así que te recomiendo que no pierdas tu tiempo en este tipo de problema pequeño (también considero que Qt Creator 2.0 es la liberación como una versión beta y puede aparecer un error) y utilizar una de las siguientes opciones:

qFatal() 
qCritical() 
qWarning() 
QMessageBox 

Personalmente uso QMessageBox :: about para depurar, ya que puedes detener el screan y leer el valor en un lugar muy útil que con el depurador no puedes (quiero decir que puedes pero no puedes ver el estado actual de tu GUI) la aplicación como depurador tomó el control).

Hope helps.

1

Para añadir a las respuestas anteriores ..

Asegúrese siempre de construir en debug modo y no en el modo release .. Como qDebug(), sólo funciona con la versión de depuración.

Este fue el error tonto que cometí, antes de que mi búsqueda para el me llevó aquí, y quería agregar este punto fino pero importante, a la lista de otras respuestas.

+0

En realidad, qDebug funciona bastante bien también en Release. Al menos los mensajes aparecen en Creator (aunque parece que ser un problema al descargar la salida, desde Creator 3.0.0). – mlvljr

0

Ninguna de estas respuestas fue adecuada para mí (usuario de Arch Linux). En lugar de tratar de explicar mis problemas, aquí hay un archivo .pro que funcionó. No estoy usando el ciclo de subprocesos de QT, simplemente un simple main() que hace cosas y existe. Estoy usando cout para mi salida:

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 
Cuestiones relacionadas