【问题标题】:Linux, can I redirect the debug output of a external library (.so)Linux,我可以重定向外部库(.so)的调试输出吗
【发布时间】:2014-07-02 17:14:12
【问题描述】:

我正在用 qt c++ 在 linux(然后是其他平台)上开发一个应用程序。 我在我的项目中使用了第三方库。在程序执行期间,库在我的调试控制台上写入调试消息,我需要保持清洁以调试程序的其他部分。 我可以做些什么来仅重定向(或隐藏)来自该库的调试消息? 谢谢

问候 安德烈亚

【问题讨论】:

  • 假设您使用的是 QT Creator,只需使用调试窗口即可。它将向您展示所有内容,而无需打印以进行调试
  • 感谢您的回复。是的,我使用调试窗口,但我不想从这个第三方库中看到调试信息。

标签: c++ linux qt debugging console


【解决方案1】:

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

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

回复您的评论:

...我已经尝试过了,但该库还在发布版本中继续打印调试消息

您看到的消息似乎并不是真正的“调试”消息。消息可能是由coutprintf 打印的吗?是这样的话,恐怕你不能只重定向图书馆的消息。

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

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

#ifdef DEBUG
...
#endif

阻止你自己?

【讨论】:

  • 不幸的是,我已经尝试过了,但该库还在发布版本中继续打印调试消息。
  • 我不想修改库源,因为是 LGPL,然后我必须上传更改,但如果这是我认为我会这样做的唯一方法。
【解决方案2】:

您可以使用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) &lt;&lt; "Message.";

【讨论】:

  • 谢谢这是个好主意,但我认为这些东西使用相同的窗口输出,我需要保持窗口清洁,因为我要分析很多东西抛出调试。跨度>
  • @Andrea993 你可以对 QtDebugMsg 类型做你想做的事。如果你愿意,你可以让它去以太坊。那肯定会使调试控制台保持清洁。我会修改答案。
  • 谢谢,它有效。我没有看到允许过滤消息的“QML/JS 控制台”。我只看到“应用程序输出”
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 2018-10-04
  • 2017-10-28
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
相关资源
最近更新 更多