Linux,我可以重定向外部库的调试输出(.so)吗?
Linux, can I redirect the debug output of a external library (.so)
我正在开发qt c++应用程序,在linux上(然后是其他平台)。我在我的项目中使用第三部分的库。在程序执行期间,库在我的调试控制台上编写调试消息,我需要保持它的清洁,以便调试程序的其他部分。我怎么做才能只重定向(或隐藏)这个库中的调试消息?由于
的问候安德里亚
如果您有*。因此,您可以尝试在发布模式下编译它,这样可以避免编译/执行调试消息。
您仍然可以在"调试模式"项目中使用"发布模式"库。请注意,您也无法看到库中的任何符号。
回应你的评论:
…我已经尝试过,但库保持打印调试消息也在发布构建
看起来你看到的消息并不是真正的"调试"消息。有可能消息是由cout
或printf
打印的?如果是这样的话,恐怕你不能只重定向图书馆的信息。
你可以重定向进程的消息,当你加载一个库时,你执行的每个函数都是由加载器进程执行的,因此,它将被重定向/隐藏只是进程输出的一部分。
但是,既然你有代码,为什么不添加
#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.";
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何使用ndk-build.cmd构建Android.so文件
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- Linux,我可以重定向外部库的调试输出(.so)吗?
- 是否可以在Android Studio中使用.so作为输出构建一个本地模块
- libOpenCL.so使用VFP寄存器参数,而输出不使用