代码之家  ›  专栏  ›  技术社区  ›  Symbiosoft

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

  •  14
  • Symbiosoft  · 技术社区  · 14 年前

    在QtCreator中调试时,在 Application output tab 在我停止正在调试的应用程序之前。。。然后它们一次全部显示出来,这不是很有用。

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

    我在Windows下使用eclipsecdt和Qt-Creator。我没有在Linux下尝试(现在还没有选择)。

    7 回复  |  直到 9 年前
        1
  •  13
  •   kurige    14 年前

    虽然不是一个完整的答案,你可以安装 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等发送到日志文件。

        2
  •  7
  •   liaK    14 年前

    你呢 要查看的应用程序 qDebug()

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

    qDebug() 在应用程序仍在运行时调用消息。

    希望有帮助。

    我不确定这是否是一个答案,但它可能是一个很好的正当理由。

    qDebug()

    它们的Qt实现 函数将文本打印到 苹果操作系统。对于Windows,如果是控制台 应用程序,文本将发送到 它被送到 .

    Qt Creator Windows调试工具 here ...

    虽然我不习惯超越CDT, 我想 可能有一个调试器连接到它,因此它可以正确显示调试输出。。

    由于没有一个调试器连接到Qt创建者,它的行为可能很奇怪。。

    试试看。。

        3
  •  2
  •   CodeCrusader    11 年前

    始终确保内置 debug 模式,不在 release 模式。。 qDebug() ,仅适用于调试生成。

    这是我在寻找答案之前犯的愚蠢的错误,我想把这个很好但很重要的一点添加到其他答案的列表中。

        4
  •  1
  •   Live    14 年前

    输出+=控制台

        5
  •  1
  •   Narek    14 年前

    一旦我在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
    

    qFatal()
    qCritical()
    qWarning()
    QMessageBox
    

    希望有帮助。

        6
  •  0
  •   fejd    14 年前

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

    我在Ubuntu9.10的Qt creator2.0和Qt 4.7.0上也遇到了类似的问题,不过在关闭应用程序之前我看不到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
    
        7
  •  0
  •   Luke Dupin    8 年前

    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