QT上位机开发(日志调试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        程序开发中有很多的调试方法,比如说IDE调试,也就是设置断点、查看变量等等;比如说日志调试;比如说coredump调试等等。这里面,IDE调试一般是开发的时候进行的,而日志调试和coredump调试,则用于软件在客户电脑上出错的情况下进行的。尤其是日志文件,使用的范围特别广。今天,借助于我们编写qt程序这个机会,简单分析下qt有哪些好的调试方式。

1、直接使用qDebug调试

        qDebug可能是大家用的最多的一种调试方式。它的使用非常简单,首先是引入一个头文件,

#include <QDebug>

        接下来直接用qDebug输出信息即可,

qDebug() << "This is only a test!\n";

        有了这行打印之后,我们就可以在IDE的输出窗口看到对应的消息打印了,

2、拦截消息,生成日志文件

        前面的qDebug虽然使用比较方便,但是存在一个缺点。那就是,它只能在IDE上面使用,不能生成日志文件。所以,我们就要想一种办法,是不是可以把这些消息拦截下来,生成日志文件。

#include <QFile>
#include <QDateTime>void customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{QString logMessage;switch (type) {case QtDebugMsg:logMessage = QString("Debug: %1").arg(msg);break;case QtInfoMsg:logMessage = QString("Info: %1").arg(msg);break;case QtWarningMsg:logMessage = QString("Warning: %1").arg(msg);break;case QtCriticalMsg:logMessage = QString("Critical: %1").arg(msg);break;case QtFatalMsg:logMessage = QString("Fatal: %1").arg(msg);break;default:break;}QFile logFile("application.log");if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) {QTextStream logStream(&logFile);logStream << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ") << logMessage ;logFile.close();}
}

        为此,我们需要创建一个拦截函数customMessageHandler,回头把这个拦截函数注册下,这样qDebug生成的消息就可以顺利转变成日志文件了。

	qInstallMessageHandler(customMessageHandler);qDebug() << "This is a test!\n";qDebug() << "This is another test!\n";

3、自定义函数

        前面两种使用的都是qt自带的调试方法,其实我们自己也可以用vsnprintf这样的函数来自定义一个log生成函数,也不是很复杂。

FILE* selfLogFile = nullptr;
void customLog(const char* format, ...)
{if (selfLogFile == nullptr) {return;}time_t rawtime;struct tm* timeinfo;char timeBuffer[80];time(&rawtime);timeinfo = localtime(&rawtime);strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %H:%M:%S", timeinfo);char message[256];va_list args;va_start(args, format);vsnprintf(message, sizeof(message), format, args);va_end(args);fprintf(selfLogFile, "[%s] %s\n", timeBuffer, message);fflush(selfLogFile);
}

        有了customLog这个函数呢,我们就可以自定义日志文件了,使用的时候需要注意下,必须先创建日志文件,才能使用customLog这个函数。

	selfLogFile = fopen("selfLog.log", "a");if (selfLogFile == nullptr) {return 1;}for (int i = 0; i < 5; ++i) {customLog("Debug: Iteration %d", i);}fclose(selfLogFile);

4、总结

        三种方法都是比较好的调试方法,大家都可以灵活使用。如果软件规模比较小,第一种qDebug的方法就很不错了;如果是中大型软件,则需要借助于hook机制生成日志文件,这时候就选择第二种;第三种,大家如果想不使用qt平台的情况下,也有自己的log生成方法,则可以选择第三种。日志文件对于解决长时间运行、低概率、偶发的故障特别有效果,建议大家好好掌握。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF控件Spire.PDF for .NET【安全】演示:获取并验证 PDF 中的数字签名

在 PDF 中创建数字签名广泛用于保护 PDF 文件。因此&#xff0c;当您查看一些带有数字签名的PDF文件时&#xff0c;需要获取并验证数字签名。本文向您展示了一种通过使用Spire.PDF和 C# 代码来获取和验证 PDF 中的数字签名的解决方案。 Spire.PDF for .NET 是一款独立 PDF 控件…

【Linux】常用的基本命令指令①

前言&#xff1a;从今天开始&#xff0c;我们逐步的学习Linux中的内容&#xff0c;和一些网络的基本概念&#xff0c;各位一起努力呐&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &#x1f4af;代码…

CLIP is Also an Efficient Segmenter

表1 复现结果–Seed&#xff1a;70.7245673447014&#xff0c;dCRF&#xff1a;74.85437742935268 误差小于0.5个点&#xff0c;可以接受 表4 复现结果–训练300轮&#xff0c;Val&#xff1a;58.76741354153312&#xff0c;Test&#xff1a;59.18210 感想 VOC全部复现完成&…

基于SpringBoot的校园外卖服务系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的校园外卖服务系统,java…

小白入门基础 - tomcat

一&#xff1a;前言 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#x…

xxxView

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

【INTEL(ALTERA)】生产中使用多个目标设备,如何满足外部内存接口Intel Agilex® 7偏移匹配准则?

说明 对于外部内存接口Intel Agilex 7使用的引脚&#xff0c;不同的引脚兼容设备可能会有不同的封装延迟。如果您遵循《外部内存接口用户指南》中的“偏移匹配指南”部分所述的要求&#xff0c;您可能会发现无法同时满足多个器件的要求。用户指南仅适用于您计划在开发阶段使用…

【SpringBoot+dubbo+zk】实现服务之间rpc通信

0)前置准备&#xff0c;我们使用zk作为注册中心&#xff0c;先启动zk&#xff0c;也就是2181端口。 1)父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http…

【软件测试】概述

《软件缺陷》 定义 &#xff08;从产品内部看&#xff09;软件产品开发或维护过程中存在的错误、毛病等各种问题&#xff08;从产品外部看&#xff09;系统所需要实现的某种功能的失效或违背 表现形式(1) 软件没有实现产品规格说明所要求的功能模块(2) 软件中出现了产品规格说…

SpringBoot2.7升级项目到Springboot3踩坑指南

文章目录 概要国内顶级开源项目升级情况适配SpringBoot3指南技术细节小结 概要 由于SpringBoot3.x全面拥抱JDK17,兼容jdk21&#xff0c;jdk17乃是大势所趋。这里是从SpringBoot2.7-->SpringBoot3.1踩坑指南。 提前阅读&#xff1a;jdk8升级JDK17避坑指南&#xff08;适用于…

Transformer-MM-Explainability

two modalities are separated by the [SEP] token&#xff0c;the numbers in each attention module represent the Eq. number. E h _h h​ is the mean&#xff0c; ∇ \nabla ∇A : ∂ y t ∂ A {∂y_t}\over∂A ∂A∂yt​​for y t y_t yt​ which is the model’s out…

写字母(文件)

请编写函数&#xff0c;将大写字母写入文件中。 函数原型 void WriteLetter(FILE *f, int n);说明&#xff1a;参数 f 为文件指针&#xff0c;n 为字母数目(1 ≤ n ≤ 26)。函数将前 n 个大写英文字母写入 f 所指示的文件中。 裁判程序 #include <stdio.h> #include &…

书生·浦语大模型实战营 Lesson 1

书生浦语大模型全链路开源体系 书生浦语大模型开源历程 书生浦语大模型系列 从模型到应用 数据 预训练 微调 部署

Raect中自定义hook

一、自定义Hook 自定义Hook&#xff1a;将一些常用的、跨越多个组件的Hook功能&#xff0c;抽离出去形成一个函数&#xff0c;该函数就是自定义Hook&#xff0c;自定义Hook&#xff0c;由于其内部需要使用Hook功能&#xff0c;所以它本身也需要按照Hook的规则实现&#xff1a;…

【华为OD真题 Python】攀登者2

文章目录 题目描述示例1输入输出说明示例2输入输出说明实现代码题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的高度代表相对海拔高度。其中数组元素0代表地面。 例如[0,1,4,3,1,0,0,1,2,3,1,2,1,0], 代表…

linux进程管理工具的使用(supervisorctl、systemd、init.d、Upstart、Monit、runit、Daemontools)

1、supervisorctl&#xff1a; 这是Supervisor提供的命令行客户端&#xff0c;Supervisor是一个进程控制系统。它用于在UNIX类操作系统上控制和监视进程。它通常用于服务器环境中管理长时间运行的进程。 Supervisor 是一个用于监控和控制 UNIX 系统上的进程的程序。它不是大多…

向量数据库:usearch的简单使用+实现图片检索应用

usearch的简单使用 usearch是快速开源搜索和聚类引擎&#xff0c;用于C、C、Python、JavaScript、Rust、Java、Objective-C、Swift、C#、GoLang和Wolfram &#x1f50d;中的向量和&#x1f51c;字符串 // https://github.com/unum-cloud/usearch/blob/main/python/README.md …

第7章-第5节-Java中的比较器comparator和泛型的简单说明

1、 引入 上个章节中我们在使用TreeSet保存自定义数据类型的时候&#xff0c;类必须要实现Comparable这个接口&#xff0c;然后重写CompareTo这个方法&#xff0c;这个必须是在具体的自定义类内部去写&#xff0c;有时不方便&#xff0c;每遇到一个都要在那个类内部去写这个Co…

vs c++ qt 叫请求的json 输出到输出终端

1 接收数据 std::string response ""; //设置数据接收函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Utils::req_reply); // 设置写入数据的缓冲区 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response); 2 打印 数据类型 qDebug() << &q…

10-单例模式(Singleton)

意图 保证一个类只有一个实例&#xff0c;并提供一个访问它的全局访问点 实现 1 懒汉式&#xff0c;线程不安全 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance null) {…