qDebug没有显示__FILE __,__ LINE__

T_T*_*T_T 5 qt

根据qlogging.h

#define qDebug QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug
Run Code Online (Sandbox Code Playgroud)

但是当我使用这样的时候,文件,行,功能名称都没有显示出来.

qDebug()<< "abc"; // only show abc;
qDebug()<< "";    // show nothing;
Run Code Online (Sandbox Code Playgroud)

我搜索了一会儿,似乎没有人像我上面那样有问题.

我使用ubuntu14.04,g ++版本4.8.2,从git构建qt5.3.

use*_*041 17

您可以从默认输出格式重新格式化.该功能在Qt 5.0中引入.

行号未输出,因为默认消息模式为"%{if-category}%{category}:%{endif}%{message}".此格式表示默认输出格式不包括行号或文件名等元数据.

%cat logtest.pro

TEMPLATE = app
TARGET = logtest
mac:CONFIG-=app_bundle
SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)

%cat main.cpp

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    qSetMessagePattern("%{file}(%{line}): %{message}");
    QCoreApplication a(argc, argv);
    qDebug() << "my output";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

%qmake && make

%./ logtest

main.cpp(8): my output
Run Code Online (Sandbox Code Playgroud)

您还可以使用QT_MESSAGE_PATTERN环境变量来设置消息模式,而无需调用qSetMessagePattern().

请参阅其他占位符的参考.http://qt-project.org/doc/qt-5/qtglobal.html#qSetMessagePattern


Uga*_*uga 12

如果您深入了解Qt历史记录,您可以发现自2014年10月1日以来仅在调试版本中记录__FILE__和使用__FUNCTION__.git commit hash是d78fb442d750b33afe2e41f31588ec94cf4023ad.提交消息指出:

日志记录:禁用跟踪发布版本的调试源信息

跟踪文件,行,函数意味着必须将信息存储在二进制文件中,从而扩大大小.一些商业客户可能会惊讶于他们的内部文件和功能名称被"泄露".因此,我们仅为调试版本启用它.


Ret*_*nja 5

下面是一个简单示例,说明如何在使用qInstallMessageHandler安装的自定义消息处理程序中使用捕获的QMessageLogContext数据.我没有输出或成员因为它们似乎没用.如果需要,您也可以通过这种方式登录文件.categoryversion

#include <QDebug>
#include <QString>
#include <QDateTime>
#include <iostream>

void verboseMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static const char* typeStr[] = {"[   Debug]", "[ Warning]", "[Critical]", "[   Fatal]" };

    if(type <= QtFatalMsg)
    {
        QByteArray localMsg = msg.toLocal8Bit();
        QString contextString(QStringLiteral("(%1, %2, %3)")
                              .arg(context.file)
                              .arg(context.function)
                              .arg(context.line));

        QString timeStr(QDateTime::currentDateTime().toString("dd-MM-yy HH:mm:ss:zzz"));

        std::cerr << timeStr.toLocal8Bit().constData() << " - " 
                  << typeStr[type] << " "
                  << contextString.toLocal8Bit().constData() << " " 
                  << localMsg.constData() << std::endl;

        if(type == QtFatalMsg)
        {
            abort();
        }
    }
}

int main()
{
    //Use default handler
    qDebug() << "default handler";
    qWarning() << "default handler";
    qCritical() << "default handler";

    //Install verbose handler
    qInstallMessageHandler(verboseMessageHandler);

    qDebug() << "verbose handler";
    qWarning() << "verbose handler";
    qCritical() << "verbose handler";

    //Restore default handler
    qInstallMessageHandler(0);

    qDebug() << "default handler";
    qWarning() << "default handler";
    qCritical() << "default handler";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)