Linux,我可以重定向外部库的调试输出(.so)

时间:2014-07-02 17:14:12

标签: c++ linux qt debugging console

我在qt c ++中开发一个应用程序,在linux上(然后是其他平台)。 我在我的项目中使用了第三部分的库。在程序执行期间,库在我的调试控制台上写入调试消息,我需要保持清理它以调试程序的其他部分。 如何仅重定向(或隐藏)此库中的调试消息,我该怎么办? 感谢

此致 安德烈

2 个答案:

答案 0 :(得分:1)

如果你有* .so的代码,你可以尝试在发布模式下编译它,这样就可以避免编译/执行调试消息。

您仍然可以在“调试模式”项目中使用“发布模式”库。请注意,您无法从库中看到任何符号。

回应你的评论:

  

...我已经尝试了但是库仍然在发布版本中打印调试消息

您看到的消息似乎并非真正“调试”消息。邮件可能由coutprintf打印?是这样的,我担心你不能只重定向图书馆的消息。

您可以重定向进程的消息,并且在加载库时,您执行的每个函数都由加载器进程执行,因此,它将作为重定向/隐藏只是进程输出的一部分。

但是,既然你有代码,为什么不添加

#ifdef DEBUG
...
#endif

阻止你的自我?

答案 1 :(得分:0)

您可以使用qInstallMsgHandler并创建自定义消息处理程序。

不幸的是,这种方式意味着所有qDebug消息都以相同的方式处理,无论从哪里开始。但是,它确实可以灵活地创建自己的调试消息类型并在应用程序中使用它,而共享库使用普通的qDebug类型。

这是来自Qt示例的修改代码:

    #include <qapplication.h>
    #include <stdio.h>
    #include <stdlib.h>

    const unsigned int MyMsgType = QtFatalMsg + 1;

    void myMessageOutput(QtMsgType type, const char *msg)
    {
        switch (type) {
        case QtDebugMsg:
            // do nothing.
            break;
        case QtWarningMsg:
            fprintf(stderr, "Warning: %s\n", msg);
            break;
        case QtCriticalMsg:
            fprintf(stderr, "Critical: %s\n", msg);
            break;
        case QtFatalMsg:
            fprintf(stderr, "Fatal: %s\n", msg);
            abort();
        case MyMsgType:
            fprintf(stderr, "MyMsg: %s\n", msg);
            break;
        }
    }

    int main(int argc, char **argv)
    {
        qInstallMsgHandler(myMessageOutput);
        QApplication app(argc, argv);
        return app.exec();
    }

在其他地方打印自定义调试消息时,请使用QDebug(MyMsgType) << "Message.";