QT 自定义调试信息的输出

自定义Qt程序输出调试信息的方法 除了使用QDebug类输出调试信息外,我们还可以根据需要自定义调试信息的等级,以便更好地控制输出。通过调用qInstallMessageHandler()函数,我们将自定义的消息处理程序安装为全局消息处理程序,从而将调试信息输出到文件中。通过使用QDebug类、自定义调试信息等级和自定义消息处理程序,我们可以在Qt程序中自定义输出调试信息。上述代码中,第一行输出了一个字符串调试信息,第二行输出了一个变量的值。然后,在需要输出调试信息的地方,使用QDebug类的实例输出相关信息。 阅读详情
 

自定义调试信息的输出

  1186人阅读  评论(0)  收藏  举报

  调试信息的输出方法有很多种,  例如直接用printf,  或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进程则一般是使用syslog将调试信息输出到日志文件中等等...

  使用标准的方法打印调试信息有时候不是很方便,  例如Qt编程, 在调试已有的代码时, 我想在打印调试信息的地方, 把代码位置也打印出来以方便定位错误, 或者需要在调试信息前面加一个前辍, 好方便在调试信息太多的时候可以用grep过滤一下, 仅显示本模块的调试信息, 这时就需要一个一个地修改已有的qDebug, 使其成为以下形式:
  qDebug( "[模块名称] 调试信息  File:%s, Line:%d", __FILE__, __LINE__ );
  这样的修改比较烦人, 而且一不小心会遗漏某个没改的... 

  为了能方便地管理调试信息的输出,一个比较简单的方法就是自已定义一个打印调试信息的宏, 然后替换原来的,废话就不多说了,直接给出一个现成的,下面是一个例子, 我用WiFi表示当前代码的模块名称,我要求在模块中的所有调试信息前面均带有[WiFi]前辍,这样我就能方便地只需使用命令行 | grep "/[WiFi/]"来过滤掉来自其它模块的调试信息了:

#define qWiFiDebug(format, ...) qDebug("[WiFi] "format" File:%s, Line:%d, Function:%s", ##__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__);

  上面的宏是使用qDebug输出调试信息,在非Qt的程序中也可以改为printf,守护进程则可以改为syslog等等...  其中,决窍其实就是这几个宏 ##__VA_ARGS__, __FILE__, __LINE__ 和__FUNCTION__,下面介绍一下这几个宏:

  1)  __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
  2) __FILE__ 宏在预编译时会替换成当前的源文件名
  3) __LINE__宏在预编译时会替换成当前的行号
  4) __FUNCTION__宏在预编译时会替换成当前的函数名称

  有了以上这几个宏,特别是有了__VA_ARGS__ ,调试信息的输出就变得灵活多了。
  有时,我们想把调试信息输出到屏幕上,而有时则又想把它输出到一个文件中,可参考下面的例子:

//debug.c

#include <stdio.h>
#include <string.h>

//开启下面的宏表示程序运行在调试版本, 否则为发行版本, 这里假设只有调试版本才输出调试信息
#define _DEBUG

#ifdef _DEBUG
    //开启下面的宏就把调试信息输出到文件,注释即输出到终端
    #define DEBUG_TO_FILE
    #ifdef DEBUG_TO_FILE
        //调试信息输出到以下文件
        #define DEBUG_FILE "/tmp/debugmsg"
        //调试信息的缓冲长度
        #define DEBUG_BUFFER_MAX 4096
        //将调试信息输出到文件中
        #define printDebugMsg(moduleName, format, ...) {/
            char buffer[DEBUG_BUFFER_MAX+1]={0};/
            snprintf( buffer, DEBUG_BUFFER_MAX /
                    , "[%s] "format" File:%s, Line:%d/n", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );/
            FILE* fd = fopen(DEBUG_FILE, "a");/
            if ( fd != NULL ) {/
                fwrite( buffer, strlen(buffer), 1, fd );/
                fflush( fd );/
                fclose( fd );/
            }/
        }
    #else
        //将调试信息输出到终端
        #define printDebugMsg(moduleName, format, ...) /
                  printf( "[%s] "format" File:%s, Line:%d/n", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );
    #endif //end for #ifdef DEBUG_TO_FILE
#else
    //发行版本,什么也不做
    #define printDebugMsg(moduleName, format, ...)
#endif  //end for #ifdef _DEBUG

int main(int argc, char** argv)
{
    int data = 999;
    printDebugMsg( "TestProgram", "data = %d", data );
    return 0;
}


  上面也说了,只有支持C99规范的gcc编译器才有__VA_ARGS__这个宏,如果不是gcc编译器,或者所用的gcc编译器版本不支持__VA_ARGS__宏怎么办? 可参考下面的代码片段,我们换一种做法,可先将可变参数转换成字符串后,再进行输出即可:

void printDebugMsg( const char* format, ...)
{
    char buffer[DEBUG_BUFFER_MAX_LENGTH + 1]={0};

    va_list arg;
    va_start (arg, format);
    vsnprintf(buffer, DEBUG_BUFFER_MAX_LENGTH, format, arg);
    va_end (arg);

    printf( "%s", buffer );
}

【Qt开发教程】调试输出QDebug类详解及实战应用:通过其丰富的操作符重载和格式化选项,可以轻松地在控制台或日志中打印各种类型的数据 QDebug 提供了一种简便而强大的方式来输出调试信息,通过其丰富的操作符重载和格式化选项,可以轻松地在控制台或日志中打印各种类型的数据。在实际应用中,通过合理使用 QDebug,可以快速定位和解决问题,提高开发效率。同时,结合自定义消息处理和文件日志,可以灵活地管理调试信息和日志记录。在处理调试输出时,注意格式化和输出条件,确保调试信息的准确性和可读性。 阅读详情

相关推荐

QT的QDebug类的使用

详细说明 QDebug类提供用于调试信息的输出流。 当开发人员需要将调试或跟踪信息写到设备,文件,字符串或控制台时,将使用QDebug。 基本用途 在通常情况下,调用qDebug()函数以获得用于写入调试信息的默认QDebug对象很有用。 qDebug() << "Date:" << QDate::currentDate(); qDebug() << "Types:" << QString("String") << QCha

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2165

自定义调试信息的输出

  调试信息的输出方法有很多种,  例如直接用printf,  或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进程则一般是使用syslog将调试信息输出到日志文件中等等...  使用标准的方法打印调试信息有时候不是很方便,  例如Qt编程, 在调试已有的代码时, 我想在打印调试信息的地方, 把代码位置也打印出来以方便定位错误, 或

Lawrence的学习笔记 3526

Vamix_Final:SE206分配-VAMIX(视频音频混合器)

自述文件 VAMIX项目Greggory Tan(gtan683) 一个直接启动的.jar文件以及“ src”文件夹中的源代码,其中包括所使用的库。 (仅供参考)。 要启动VAMIX,只需在终端中使用“ chmod u + x VAMIX.jar”以使jar可执行。 然后双击jar启动VAMIX,将弹出第一则消息,指示您应该阅读手册。 如果未出现该消息,请按Ctrl + H组合出用户手册

C语言 __VA_ARGS__ - C语言零基础入门教程

目录 一.__VA_ARGS__简介 二.__VA_ARGS__使用 1.__VA_ARGS__宏输出字符串常量 2.__VA_ARGS__宏输出可变参数 三.__VA_ARGS__缺点 1.仅仅只支持字符串常量,不支持可变参数 2.仅仅只支持可变参数,不支持字符串常量 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.__VA_ARGS__简介 __VA_ARGS__ 是一个可变参数的宏,是新的 C99 规范中新增的,目前

猿说编程 2655

Qt实现简单的qDebug输出到日志文件

Qt实现的qDebug信息输出到日志文件中,不依赖第三方库,简单实用,使用于小型工程的日志输出,资源下载次数过多,重新修改积分值。

__VA_ARGS__用法

调试信息的输出方法有很多种,  例如直接用printf,  或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进程则一般是使用syslog将调试信息输出到日志文件中等等

Qt 之 qInstallMessageHandler(重定向至文件)

在Qt之qInstallMessageHandler(输出详细日志)一节中,我们讲解了如何使用自定义消息处理程序输出调试信息,而且可以很直观、很方便的得到输出代码所在的文件、函数、行号等信息。当软件发布的时候,通常都会采用日志输出功能,方便我们后期的跟踪、查找问题。

青春不老,奋斗不止! 3万+

Allegro负片层不显示反盘的原因和解决办法

在用Allegro做PCB设计的时候,负片设计是较为常用的一种方式,有时会出现打开负片层却看不到反盘的情况,如下图。如何才能看到反盘显示的效果,具体操作如下。负片层不显示反盘的原因和解决办法。L2层仍然只能看到盘。

weixin_54787054的博客 2160

学习记录-Qt将调试信息保存到文件

如果能将调试信息打印到文件,那软件发布到其他机器运行时,就可以记录软件运行的异常情况了。 查看手册,Qt 的QtMsgHandler qInstallMsgHandler ( QtMsgHandler handler )函数可以安装一个自定义的消息处理函数,自带的例子如下: #include #include #include void myMessageOutput(QtMs

limilie的专栏 2443

TC397 EB MCAL开发从0开始系列 之 [17.1] ETH配置实战 - ping/发送

TC397 MCAL 从0开始之 ETH ping测试

yy九歌的博客 1506

yolov26改进 | 融合改进篇 | 华为VanillaNet配合HSFPN助力yolov26有效涨点(教你如何融合创新点)

本文介绍华为VanillaNet主干与HSFPN融合改进的YOLOv26。VanillaNet采用极简卷积结构,减少复杂分支与冗余操作,兼顾特征提取效率;HSFPN原本面向白细胞多尺度检测,通过特征选择模块筛除无效响应,再利用特征融合模块整合不同层级信息,增强大小目标表达。两者分别优化Backbone与Neck,结构互补,可进一步搭配改进损失函数和检测头开展消融实验与论文创新。已有多位读者反馈在各自数据集上取得涨点。文中提供完整代码、配置文件、模块注册及Codex修改思路,方便复现。

Snu77的博客 454

QDebug 输出调试信息

在程序开发过程中,我们经常需要打印一些调试信息到终端,以供我们开发人员快速定位软件的问题所在。而QDebug类就是用来完成这样的功能的一个类。使用QDebug类,我们可以将调试信息打印到控制台、文件、甚至某个字符串中。

3万+

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 503

QT日志输出调试信息

本例主要介绍把QT调试信息,通过日志文件的形式输出,多用于Release版本。 在main.cpp修改如下代码: #include <QApplication> #include <QDateTime> #include <QFile> #include <QTextStream> #include "mainwindow.h" //输出调试信息 void outputMsg(QtMsgType type, const char* m_cpMesg) {

我不是码农的博客~~~ 871

MSBlock赋能C2f模块,让目标检测在轻量化与精度间双向突破

在文件夹下新建,将上述MSBlock和C2f_MS类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义模块。

LXY_LOVE36的博客 143

机器人环境仿真软件:Webots_(9).路径规划与导航算法仿真实现

通过仿真,我们可以验证路径规划算法的有效性和鲁棒性,同时优化机器人在不同环境中的导航性能。动态窗口法是一种局部路径规划算法,通过在机器人当前速度空间中选择一个最优的速度窗口,使机器人在动态环境中安全地移动。算法的代价函数通常包括两个部分:从起始点到当前节点的实际代价(g-cost)和从当前节点到目标节点的估计代价(h-cost)。在World Editor中,选择“Insert”菜单,添加“Robot”对象,如“E-puck”或“Thymio”。Dijkstra算法的实现与A*算法类似,但不使用启发函数。

kkchenjj的博客 2006

【Qt专栏】将调试信息输出到日志文件中

将工程的调试信息输出到日志文件中,只要花10分钟就能学会,用心真的很简单!

weixin_43729127的博客 1523

【后量子密码】SPHINCS+ 算法(二):签名与验签(附源码分析)

本节介绍SPHINCS+ 算法的密钥生成、签名与验签。nnn:安全参数;www:Winternitz参数,WOTS+签名分解的基底;hhh:超树的高度;ddd:超树中子树的层数;kkk:FORS 树的数量;ttt:FORS 树的叶子节点数。

听雨草堂 4680

Qt屏蔽qDebug打印

做项目免不了qDebug打印调试信息。随着项目的完善,于是在控制台看到到处都是qDebug的信息,这不但影响程序的效率,而且也不容易定位真正的错误信息。于是想到了QT中可以屏蔽qDebug打印调试信息,然后在项目中调试的时候用qDebug项目完结把它屏蔽掉就OK。下面是我使用宏自定义的输出格式: #ifndef OUT_FORMAT #define OUT_FORMAT "{ FILE:["&...

刘一儿(嵌入式) 1626

【反封禁策略】集成 Undetected-Chromedriver:让 Browser-Use 绕过 Cloudflare 五秒盾

摘要:AI Agent如何突破Cloudflare检测的实战指南 本文针对AI Agent在Cloudflare检测下频繁受阻的问题,深入分析了undetected-chromedriver的工作原理与局限性。文章指出,Cloudflare 2026年的检测体系已升级为"浏览器指纹+IP信誉+协议指纹+行为模式"的多维交叉验证,单一伪装方案难以奏效。 核心内容包括: undetected-chromedriver的三层补丁体系解析 v2与v3版本的适用场景对比 两种Browser-Use集成方案:Selen

ZDQ58818的博客 284

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

QT的使用-----Debug调试信息输出到文件中

将CDFPSK.dll动态库加到运行目录下并在main.c文件中加如以下代码: #include <QLibrary> void myMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString& msg); int main(int argc, char *argv[]) { ...

sbllb的博客 1031

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[原创]QT中进行debug输出和使用cout cin等的问题

本文参考了:http://doc.qt.nokia.com/stable/debug.html#warning-and-debugging-messages http://socol.iteye.com/blog/719500   在qt中大家都知道不能像纯C++那样使用cout等进行debug, 因为输出的内容会保留到程序退出的时候才进行输出。   Warning and Debugg...

686

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Qt之qInstallMessageHandler(重定向至文件)

简述 在Qt之qInstallMessageHandler(输出详细日志)一节中,我们讲解了如何使用自定义消息处理程序输出调试信息,而且可以很直观、很方便的得到输出代码所在的文件、函数、行号等信息。 当软件发布的时候,通常都会采用日志输出功能,方便我们后期的跟踪、查找问题。 简述 自定义消息处理 效果 源码 更多参考 ...

weixin_34406086的博客 1041

Qt 使用#define+qDebug()输出调试信息

/******************************************************************************************* * Qt 使用#define+qDebug()输出调试信息 * 声明: * 当我们在写程序的时候,往往需要写一些特殊的调试信息,同时很...

weixin_33974433的博客 225
上一篇: QT设置控件颜色
下一篇: static 静态变量
风捂九天
博客等级 码龄15年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值