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



我正在开发qt c++应用程序,在linux上(然后是其他平台)。我在我的项目中使用第三部分的库。在程序执行期间,库在我的调试控制台上编写调试消息,我需要保持它的清洁,以便调试程序的其他部分。我怎么做才能只重定向(或隐藏)这个库中的调试消息?由于

的问候安德里亚

如果您有*。因此,您可以尝试在发布模式下编译它,这样可以避免编译/执行调试消息。

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

回应你的评论:

…我已经尝试过,但库保持打印调试消息也在发布构建

看起来你看到的消息并不是真正的"调试"消息。有可能消息是由coutprintf打印的?如果是这样的话,恐怕你不能只重定向图书馆的信息。

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

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

#ifdef DEBUG
...
#endif

阻碍了你的自我?

您可以使用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: %sn", msg);
            break;
        case QtCriticalMsg:
            fprintf(stderr, "Critical: %sn", msg);
            break;
        case QtFatalMsg:
            fprintf(stderr, "Fatal: %sn", msg);
            abort();
        case MyMsgType:
            fprintf(stderr, "MyMsg: %sn", msg);
            break;
        }
    }
    int main(int argc, char **argv)
    {
        qInstallMsgHandler(myMessageOutput);
        QApplication app(argc, argv);
        return app.exec();
    }

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

最新更新