qDebug没有显示__FILE __,__ LINE__

时间:2014-06-03 09:53:25

标签: qt

根据qlogging.h

#define qDebug QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug

但是当我像这样使用时,文件,行,功能名称都没有显示。

qDebug()<< "abc"; // only show abc;
qDebug()<< "";    // show nothing;

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

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

7 个答案:

答案 0 :(得分:17)

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

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

%cat logtest.pro

TEMPLATE = app
TARGET = logtest
mac:CONFIG-=app_bundle
SOURCES += main.cpp

%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;
}

%qmake&amp;&amp;使

%。/ logtest

main.cpp(8): my output

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

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

答案 1 :(得分:11)

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

  

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

     

跟踪文件,行,功能意味着必须有信息   存储在二进制文件中,扩大了大小。它也可能是一个   一些商业客户对他们的内部文件&amp;   函数名称'泄露'。因此我们为调试版本启用它   仅

答案 2 :(得分:5)

以下是如何在使用QMessageLogContext安装的自定义消息处理程序中使用捕获的qInstallMessageHandler数据的简单示例。我没有输出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;
}

答案 3 :(得分:2)

您可以使用标准C ++ __LINE____FILE__。另外,请查看What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__ SO question。如果使用GCC,则可以编写__PRETTY_FUNCTION__以获取有关代码执行位置的函数的信息。只需准备你喜欢的debug-define。

例如,这是一个小的可编译应用程序:

#include <QApplication>
#include <QDebug>
#include <iostream>

// Qt-way
#define MyDBG (qDebug()<<__FILE__<<__LINE__<<__PRETTY_FUNCTION__)
// GCC
#define MyStdDBG (std::cout<< __FILE__<<":"<<__LINE__<<" in "<<__PRETTY_FUNCTION__<<std::endl)

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // Qt-way
    MyDBG;
    MyDBG << "Something happened!";

    // GCC
    MyStdDBG;

    return a.exec();
}

它提供下一个输出:

../path/main.cpp 14 int main(int, char**)
../path/main.cpp 15 int main(int, char**) Something happened!
../path/main.cpp:18 in int main(int, char**)

UPD:添加了纯C ++ - 输出方式。

答案 4 :(得分:1)

我认为您需要定义:

#define qDebug() QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()

并将其用作

qDebug() << "abc";

#define qDebug QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()

并将其用作:

qDebug << "abc";

答案 5 :(得分:1)

根据文件qDebug() is already a macro to QMessageLogger()。默认消息处理程序仅将消息打印到stderr。我想您可能想要使用qInstallMessageHandler() to install your own message handler, that uses the context

编辑:

手册中有相关部分描述了此问题。在Qt4中,上下文变量未传递给已安装的消息处理程序,因此此解决方案仅为Qt5 +。默认消息处理程序不使用传入的上下文,但您可以轻松安装自己的,它只是一个函数指针。 There is even an example in the manual.

答案 6 :(得分:1)

这取决于您的Qt版本号,无论您是使用Qt的调试版本还是发布版本,以及您是否在应用程序中定制了Qt消息处理。

根据源代码“qlogging.cpp”编写的Qt 5.4文档:

QMessageLogger is used to generate messages for the Qt logging framework. Usually one uses
it through qDebug(), qWarning(), qCritical, or qFatal() functions,
which are actually macros: For example qDebug() expands to
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()
for debug builds, and QMessageLogger(0, 0, 0).debug() for release builds.

因此,如果您在输出中没有看到文件,行和函数名称信息,很可能您使用的是Qt的发行版本。

如果您仍希望在输出中看到Qt的发布版本中的文件,行和函数名称信息,有几种方法可以实现它,正如之前的一些答案中所解释的那样。