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

2024-01-07 18:46:43

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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生成方法,则可以选择第三种。日志文件对于解决长时间运行、低概率、偶发的故障特别有效果,建议大家好好掌握。

文章来源:https://blog.csdn.net/feixiaoxing/article/details/135442223
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。