在QtCreator中调试时如何查看qDebug消息

时间:2010-07-21 13:54:59

标签: qt gdb mingw qt-creator

我正在从Eclipse CDT(使用Qt集成插件)转换到QtCreator 2.0,但仍然有一件事让QtCreator感到困扰:

当我在QtCreator中调试时,我没有在Application output tab内看到我的qDebug消息,直到我停止正在调试的应用程序......然后它们都会立即显示,这对我们来说并不是很有用。< / p>

使用Eclipse,我没有这个问题:在单步执行源代码时遇到qDebug消息正确显示。

我在Windows下使用Eclipse CDT和Qt Creator。我没有在Linux下尝试(现在不是一个选项)。

7 个答案:

答案 0 :(得分:12)

虽然不是一个完整的答案,但您可以安装DebugView(如果您在XP计算机上),以便在尝试解决此问题时查看qDebug输出。

另一个解决方案可能被认为是一个黑客,但工作得很好,就是自己简单地劫持调试消息:

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

哪个会输出:

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

这实际上是对我自己用来将qDebug,qWarning等发送到日志文件的一些代码的修改。

答案 1 :(得分:7)

无需关闭应用程序即可查看qDebug()条消息。

在Qt Creator的最底部有一个名为3 - Application output的标签。 单击该窗口将显示Qt Creator底部的应用程序输出窗口。

在应用程序仍在运行时,一旦它们被调用,该特定窗口将显示qDebug()消息。

希望它有所帮助。

修改

我不确定这是否是一个答案,但它可能是一个很好的有效原因。

来自qDebug()文档,

  

这些的Qt实现   函数将文本打印到   Unix / X11和Mac下的stderr输出   OS X.使用Windows,如果它是一个控制台   应用程序,文本发送到   安慰;否则,将其发送给   调试器

现在Qt Creator没有附加它自己的调试器。

Qt Creator文档中,我们必须手动安装调试器。由于您使用的是Windows,因此需要手动安装 Windows调试工具。可以找到更多文档here ...

虽然我不习惯Eclipse CDT,我假设可能附加了一个调试器,因此它正确显示调试输出..

由于没有调试器附加到Qt Creator,它可能表现得很奇怪..

试一试..

答案 2 :(得分:2)

添加上述答案..

始终确保以debug模式构建,而不是release模式。 作为qDebug(),仅适用于调试版本。

在我搜索引导我之前,这是我犯的愚蠢错误,我想在其他答案列表中添加这个优点但重要的一点。

答案 3 :(得分:1)

您是否尝试将以下行添加到.pro?

OUTPUT + =控制台

然后你可以输出std :: cout。

答案 4 :(得分:1)

让我告诉你一些事情:

我在linux上开发了一个c ++控制台应用程序。在运行应用程序期间,它正在读取文件并通过打印出一些状态消息开始处理某些逻辑。当我运行该应用程序时,输出正常。所以为了方便调试,我决定像这样运行应用程序:

./a.out |& tee log

此命令将标准输出(可能也是我不记得的标准错误)重定向到名为“log”的文件中。因此,当我使用此选项运行时,我看到它在日志文件中写入与std完全相同,只有这样的位移:

标准输出 - 所需输出

A
operation 1 success
B
operation 2 success
C
operation 3 success
D
operation 4 success
日志文件中的

- 带位移的输出(这不正确)

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

我猜你的问题就是这种问题......我已经看过QDebug并且没有看到任何释放缓冲区的函数(类似于名为flush的操作)。所以我建议你不要在这个小问题上花些时间(我也认为Qt Creator 2.0是作为测试版发布的,它可能看起来像一个bug)并使用以下其中一个:

qFatal()
qCritical()
qWarning()
QMessageBox

我个人使用QMessageBox :: about来调试,因为你可以停止screan并在一个非常有用的地方读取值,而调试器你不能(我的意思是你可以但你看不到当前的状态)您作为调试器的GUI应用程序已经取得了控制权。)

希望有所帮助。

答案 5 :(得分:0)

这是一种解决方法,但您可以安装自己的消息处理程序。如果您还没有这样做,请查看文档中的qInstallMsgHandler。

我在使用Qt Creator 2.0和Qt 4.7.0的Ubuntu 9.10上有类似的问题,但在应用程序关闭之前我没有看到stdout输出。就好像缓冲区没有被刷新一样。 打印到stderr会立即显示应用程序输出窗口中的输出。

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

答案 6 :(得分:0)

这些答案都不适合我(Arch linux用户)。这不是试图解释我的麻烦,而是一个有效的.pro文件。我没有使用QT线程循环,纯粹只是一个简单的main()来做东西和存在。我正在使用cout输出:

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