一般情况下,我们在使用编译器运行软件的情况下,都可以打印出调试信息,但是如果是发布后的软件,就不能在编译器上看到调试、出错等日志信息,于是就要通过其他方法查看日志信息,一种比较好的方法,就是把软件日志输出到文件中,这样我们就可以通过文件查看。
结果:
这是在编译器中打印的调试的信息:
下面为使用adb查看MyRatailLog的日志信息:
控制日志文件:
.h 文件
#ifndef QDEBUG2LOGCAT_H
#define QDEBUG2LOGCAT_H
#ifdef ANDROID
void installLogcatMessageHandler(const char* TAG);
#else
#define installLogcatMessageHandler(TAG)
#endif
#endif // QDEBUG2LOGCAT_H
.cpp文件
#include "qdebug2logcat.h"
//安卓打印日志
#ifdef ANDROID
#include
static const char* g_TAG = 0;
#include
#include
static void messageOutput2Logcat(QtMsgType type, const QMessageLogContext &content, const QString& msg){
int prio = ANDROID_LOG_VERBOSE;
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
prio = ANDROID_LOG_DEBUG;
break;
case QtWarningMsg:
prio = ANDROID_LOG_WARN;
break;
case QtCriticalMsg:
prio = ANDROID_LOG_ERROR;
break;
case QtInfoMsg:
prio = ANDROID_LOG_INFO;
break;
case QtFatalMsg:
prio = ANDROID_LOG_FATAL;
abort();
}
__android_log_write(prio, g_TAG, localMsg.data());
}
void installLogcatMessageHandler(const char *TAG)
{
g_TAG = (TAG == 0? "QDebug":TAG);
qInstallMessageHandler(messageOutput2Logcat);
}
#endif
在main函数中注册日志信息:
#include "maininterface.h"
#include
#include"qdebug2logcat.h"
int main(int argc, char *argv[])
{
//android调试
#ifdef ANDROID
installLogcatMessageHandler("MyRatailLog");
//安装adb后
//查看日志方法:adb logcat -v time -s MyRatailLog
#else
QApplication a(argc, argv);
MainInterface w;
w.show();
return a.exec();
}
安装adb,然后使用adb指令查看。
例如在Mac下安装adb,
cd ~
touch .bash_profile
sudo vim ~/.bash_profile
然后在文件中,输入:
ANDROID_HOME=/Users/apple/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
其中:ANDROID_HOME=/Users/apple/Library/Android/sdk
为自己Android SDK的安装路径
输入完成后,按下esc键,按shift + ;
,再按wq
退出。
结果:
在windwos环境中的日志信息存在运行文件的路径下:
在Mac环境中的系统日志存在于app包含的运行文件中:
下面为在main函数中的代码:
#include "maininterface.h"
#include
#include"qdebug2logcat.h"
#include
#include
#include
#ifdef WINDOWS
#include
#define MAX_PATH 200
#endif
static FILE* g_log_fp = 0;
static void closeLogFile(){
fclose(g_log_fp);
}
static void messageOutput2Logcat(QtMsgType type, const QMessageLogContext &content, const QString& msg){
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
fprintf(g_log_fp, "Debug: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtWarningMsg:
fprintf(g_log_fp, "Warning: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtCriticalMsg:
fprintf(g_log_fp, "Critical: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtInfoMsg:
fprintf(g_log_fp, "Info: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtFatalMsg:
fprintf(g_log_fp, "Fatal: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
abort();
}
}
int main(int argc, char *argv[])
{
//android调试
#ifdef ANDROID
installLogcatMessageHandler("MyRatailLog");
//安装adb后
//查看日志方法:adb logcat -v time -s MyRatailLog
#else
#ifdef WINDOWS //windwos调试
char buffer[MAX_PATH];
getcwd(buffer, MAX_PATH);
strcat(buffer, "/ratail.log");
g_log_fp = fopen(buffer , "wt");
#else //mac调试
g_log_fp = fopen("ratail.log" , "wt");
#endif
atexit(closeLogFile); //关闭日志文件
qInstallMessageHandler(messageOutput2Logcat);
#endif
QApplication a(argc, argv);
MainInterface w;
w.show();
return a.exec();
}