做一個(gè)模板網(wǎng)站多少錢如何推廣好一個(gè)產(chǎn)品
在Qt中,一般習(xí)慣使用qDebug信息進(jìn)行輸出和打印調(diào)試信息到console或者文件中,在qDebug中,也有一些小技巧,可以幫助我們更好的使用qDebug打印日志記錄,本文分享了qDebug使用的一些小技巧。
1. 打印出文件名、行號、調(diào)用函數(shù)等上下文信息
????有些時(shí)候是不是可能會(huì)遇見這樣的事情,自己不知道在哪兒打印了一串debug信息,但是現(xiàn)在不知道在哪兒了,并且由于文件很多,比較難以尋找。本次提到的方法就可以解決這個(gè)問題。首先,要明白一件事,打印出行號、文件名一定要在調(diào)用qDebug時(shí)就知道當(dāng)前位置,C語言是通過 __FILE__
__LINE__
這些東西得到的,而qDebug也是一樣的方式,它是一個(gè)宏實(shí)現(xiàn)是這個(gè)樣子的。
#define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug
#define qInfo QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).info
#define qWarning QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).warning
#define qCritical QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).critical
#define qFatal QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).fatal
而其中
#define QT_MESSAGELOG_FILE __FILE__
#define QT_MESSAGELOG_LINE __LINE__
#define QT_MESSAGELOG_FUNC Q_FUNC_INFO
????所以,qDebug 本身應(yīng)該是支持了打印上下文信息的,但是為什么我們平時(shí)打印的信息沒有呢?
????這個(gè)是因?yàn)樾枰ピO(shè)置一下message的pattern
????設(shè)置pattern有兩種方法:
-
qSetMessagePattern
函數(shù)
通過函數(shù)設(shè)置格式,例如:qSetMessagePattern("[%{type}]%{file}:%{line}\t%{time}\t%{function}\n%{message}")
-
QT_MESSAGE_PATTERN
環(huán)境變量
通過設(shè)置全局環(huán)境變量或者使用qputenv("QT_MESSAGE_PATTERN", "[%{type}]%{file}:%{line}\t%{time}\t%{function}\n%{message}");
的手法,來設(shè)置pattern
????或者換個(gè)思路,qt為我們提供了一個(gè)handle
,使用 qInstallMessageHandler
設(shè)置
void msgHandle(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{printf("Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
}qInstallMessageHandler(msgHandle);
2. 將qDebug內(nèi)容輸出到文件中
????將qDebug輸出到文件當(dāng)中則是直接采用 qInstallMessageHandler
的思路來做,在這個(gè)函數(shù)中,將printf
改成fprintf
即可。
3. 正式運(yùn)行時(shí)屏蔽掉 debug 信息
????在qlogging.h
中有一段代碼
#if defined(QT_NO_DEBUG_OUTPUT)
# undef qDebug
# define qDebug QT_NO_QDEBUG_MACRO
#endif
????意味著其實(shí)當(dāng)定義了上面的qDebug宏后,其實(shí)下面還有宏條件重新定義,展開看看 QT_NO_QDEBUG_MACRO
則是
#define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug
????所以,我們在編譯時(shí),加入一個(gè)宏即可(pro文件直接寫法如下:)
DEFINES += QT_NO_DEBUG_OUTPUT