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

news2024/11/25 6:55:27

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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.coloradmin.cn/o/1366580.html

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

相关文章

OCP NVME SSD规范解读-5.命令超时限制-2

Sanitize清除的数据很彻底&#xff0c;对FTL映射表、User Data(包括已经写入NAND和仍在cache里的)、Meta Data、安全密匙、CMB中SQ/CQ相关信息、可能含有用户数据的log等等会全部清除。不过&#xff0c;sanitize操作不会改变RPMB、boot分区、不包含用户数据的cache等内容。 RP…

2.4 DEVICE GLOBAL MEMORY AND DATA TRANSFER

在当前的CUDA系统中&#xff0c;设备通常是带有自己的动态随机存取存储器&#xff08;DRAM&#xff09;的硬件卡。例如&#xff0c;NVIDIA GTX1080具有高达8 GB的DRAM&#xff0c;称为全局内存。我们将互换使用全局内存和设备内存这两个术语。为了在设备上执行内核&#xff0c;…

CSS 圆形分割按钮动画 带背景、图片

<template><view class="main"><view class="up"> <!-- 主要部分上 --><button class="card1"><image class="imgA" src="../../static/A.png"></image></button><butt…

数据库系统-甘晴void学习笔记

数据库系统笔记 计科210X 甘晴void 202108010XXX 教材&#xff1a;《数据库系统概论》第6版 &#xff08;图片来源于网络&#xff0c;侵删&#xff09; 文章目录 数据库系统<br>笔记第一篇 基础篇1 绪论1.1数据库系统概述1.2数据模型1.3数据库系统的结构(三级模式结构…

【优选算法】专题三:二分查找 --- 34. 在排序数组中查找元素的第一个和最后一个位置

从今天开始,xxxflower 带着小伙伴们一起学习算法 ~ 今天我们要写的题目是: 34. 在排序数组中查找元素的第一个和最后一个位置 以下是题目的详细解析: class Solution {public int[] searchRange(int[] nums, int target) {// 判断数组为空的情况下返回-1,-1int[] ret new in…

2023年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:因子问题 任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。 时间限制:10000 内存限制:65536 输入 包括两个整数N、M。N不超过1,000,000。 输出 输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存…

reiserfs文件系统的磁盘布局

reiserfs文件系统的磁盘布局比较简单&#xff0c;它把整块分区分成相同大小的block块&#xff0c;一个block块的大小默认是4K&#xff0c;而最大块数未2^32次方&#xff0c;即一个分区最大大小为16TB。 reiserfs文件系统分区的前64KB总是为分区标签&#xff08;partition labe…

《每天一分钟学习C语言·十一》static静态,内联函数,宏函数,排序

1、 static静态修饰符 static全局变量和普通全局变量区别 static全局变量只能在本文件中使用&#xff0c;普通全局变量可以在一个项目下的所有文件中使用&#xff0c;需要加extern。static全局变量只能初始化一次 static局部变量和普通局部变量区别&#xff1a; static局部变量…

【性能测试】JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

盛元广通实验室业务流审批管理系统2.0

系统通过对取样、分析、数据处理、检验报告等分析全过程中多种影响因素的有效管理&#xff0c;强化检验质量&#xff0c;获得准确可靠的分析成果。业务流审批管理系统主要包括了检测管理、业务受理、样品管理、资源质量管理、分包管理、报告生成、统计分析等&#xff0c;系统能…

Spring学习 基于注解的AOP控制事务

8.1.拷贝上一章代码 8.2.applicationContext.xml <!-- 开启spring对注解事务的支持 --> <tx:annotation-driven transaction-manager"transactionManager"/> 8.3.service Service Transactional(readOnlytrue,propagation Propagation.SUPPORTS) publi…

商城小程序(7.加入购物车)

目录 一、配置vuex二、创建购物车的store模块三、在商品详情页中使用store模块四、实现购加入购物车功能五、动态统计购物车中商品的总数量六、持久化存储购物车的商品七、优化商品详情页的total侦听器八、动态为tabBar页面设置数据徽标九、将设置tabBar徽标的代码抽离为mixins…

在Spring Cloud Config Github配置中心

关于Spring Cloud系列我们其实讲解了很多&#xff0c;但是这里我们介绍一下Spring Cloud Config&#xff0c;它是一个解决分布式系统的配置管理方案&#xff0c;他包含了Client 和 Server 两个部分&#xff0c;server提供配置文件的存储&#xff0c;以接口的方式将配置文件内容…

【数据库】聊聊常见的索引优化-下

分页查询优化 主键排序 在实际的使用中&#xff0c;通过limit 10000,10 查询第10000记录到10010记录&#xff0c;mysql执行的时候是按照将前10010记录全部统计出来&#xff0c;然后剔除前10000条记录&#xff0c;选择后10条记录。这样来看的话&#xff0c;效率不高。 如果数据…

Java桶排序、基数排序、剪枝算法

桶排序算法 桶排序的基本思想是&#xff1a; 把数组 arr 划分为 n 个大小相同子区间&#xff08;桶&#xff09;&#xff0c;每个子区间各自排序&#xff0c;最后合并 。计数排序是桶排序的一种特殊情况&#xff0c;可以把计数排序当成每个桶里只有一个元素的情况。 1.找出待…

企鹅目标检测数据集VOC格式400张

企鹅&#xff0c;一种可爱而独特的鸟类&#xff0c;以其圆滚滚的身体、黑白相间的羽毛和独特的行走方式而备受人们喜爱。 企鹅是鸟纲、企鹅科的动物&#xff0c;它们生活在南半球&#xff0c;特别是南极地区。企鹅的体型短而肥胖&#xff0c;有着流线型的身体和黑白相间的羽毛…

24/1/8

传奇登录界面&#xff1b; #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口设置this->setWindowTitle("传奇");//窗口名this->setWindowIcon(QIcon("C:\\Users\\21528\\Desktop\\图标.png"));//窗口图标th…

【Flutter 开发实战】Dart 基础篇:最基本的语法内容

在深入了解 Dart 这门编程语言之前&#xff0c;我们需要了解一些关于 Dart 的最基本的知识&#xff0c;像是常量、变量、函数等等&#xff0c;这样才能够让我们的开发效率更上一层楼。在本节&#xff0c;我们将探讨一些基础语法&#xff0c;包括入口方法 main、变量、常量以及命…

ERA5和GNSS站点不并址的处理方法二:垂直补偿(获得GNSS站点高度的PWV、温度和气压,基于matlab)

0. 码字不易&#xff0c;点赞加关注&#xff08;公众号&#xff1a;WZZHHH&#xff0c;部分资料在公众号可以下载&#xff09; Part1 垂直补偿的原因 我们在获取GNSS站点位置的PWV有很多方法&#xff0c;其中一个是利用ERA5数据进行积分得到。由于ERA5格网位置和GNSS不并址&am…

信息安全监管

安全政策 中央办公厅2003的27号文件 《国家信息化领导小组关于加强信息安全保障工作的意见》 方针&#xff1a;积极防御&#xff0c;综合防范 目标、要求&#xff1a;全面提高信息安全防护能力&#xff0c;保护公众利益&#xff0c;维护国家安全 4大原则&#xff1a; 立足…