qdebug release和debug的不同实现

转载 2018年04月17日 19:34:23

开发环境:Win10 Qt5.7.0 VisualStudio2015
核心:qInstallMessageHandler函数
官方文档:http://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler
Qt可将qDebug()输出的信息(其他信息),进行额外处理
最常见的用法,是将输出信息保存到txt文本文件中,可做发布后日志功能

范例(在Release模式下,qDebug()输出的调试信息保存至软件根目录下*.lgt文件中)

  1. #include <QApplication>  
  2. #include <iostream>  
  3. #include <cstdlib>  
  4. #include <QFile>  
  5. #include <QString>  
  6. #include <QTextStream>  
  7. #include <QMutex>  
  8. #include <QDateTime>  
  9. using namespace std;  
  10.   
  11. QMutex mutex;//日志代码互斥锁  
  12. QString timePoint;  
  13.   
  14. //日志生成  
  15. void LogMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)  
  16.  {     
  17.      mutex.lock();  
  18.      cout << msg.toStdString() << endl;  
  19.      //Critical Resource of Code  
  20.      QByteArray localMsg = msg.toLocal8Bit();  
  21.      QString log;  
  22.        
  23.      switch (type) {  
  24.      case QtDebugMsg:  
  25.          //fprintf(stderr, “Debug: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  26.          log.append(QString(”Debug  File:%1 %2  Line:%3  Content:%4”).arg(context.file).arg(context.function).arg(context.line).arg(msg));  
  27.          break;  
  28.      case QtInfoMsg:  
  29.          //fprintf(stderr, “Info: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  30.          log.append(QString(”Info: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  31.          break;  
  32.      case QtWarningMsg:  
  33.          //fprintf(stderr, “Warning: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  34.          log.append(QString(”Warning: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  35.          break;  
  36.      case QtCriticalMsg:  
  37.          //fprintf(stderr, “Critical: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  38.          log.append(QString(”Critical: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  39.          break;  
  40.      case QtFatalMsg:  
  41.          //fprintf(stderr, “Fatal: %s (%s:%u, %s)\n”, localMsg.constData(), context.file, context.line, context.function);  
  42.          log.append(QString(”Fatal: %1  %2  %3  %4”).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));  
  43.          abort();  
  44.      }  
  45.        
  46.      QFile file;  
  47.      QString path = QString(”log%1.lgt”).arg(timePoint);  
  48.      file.setFileName(path);  
  49.      if (!file.open(QIODevice::ReadWrite | QIODevice::Append))  
  50.      {  
  51.          QString erinfo = file.errorString();  
  52.          cout << erinfo.toStdString() << endl;  
  53.          return;  
  54.      }  
  55.      QTextStream out(&file);  
  56.      out << ”\n\r” << log;  
  57.      file.close();  
  58.   
  59.      mutex.unlock();  
  60.  }  
  61.   
  62. int main(int argc, char *argv[])  
  63. {  
  64.     //release模式下,调试信息输出至日志文件  
  65. #ifndef _DEBUG  
  66.     timePoint = QDateTime::currentDateTime().toString(”yyyyMMddHHmmss”);  
  67.     qInstallMessageHandler(LogMsgOutput);  
  68. #endif  
  69.     QApplication a(argc, argv);  
  70.     Widget w;  
  71.     w.show();  
  72.   
  73.     return a.exec();  
  74. }  

不同数据库表结构的转化

通过学习PowerDesigner工具,学习概念模型,物理模型,面向对象模型,业务模型,以及不同数据库表结构的转化。
  • 2018年01月13日 15:42

qDebug()的输出控制及qmake的debug和release

如何让qDebug()不输出? 文档中说如果定义了宏  QT_NO_DEBUG_OUTPUT ,qDebug将什么都不做。   在QT的工程文件.pro中定义 DEFINES+= QT_NO...
  • jmshl
  • jmshl
  • 2011-09-15 15:39:36
  • 4259

Qt qDebug方法release时不打印

在compile時決定qDebug()要不要把訊息印出來,這樣,在release的時候,就可以把debug message關掉。 只要define QT_NO_DEBUG_OUTPUT 這個 sym...
  • talking12391239
  • talking12391239
  • 2013-12-06 10:07:38
  • 2425

谈在Debug和Release模式下输出调试信息 .

在调试程序时,有时候设置断点单步运行并不能查出问题的所在,比如程序可能在运行一段时间后死掉了,或者对于Release版本运行不正常等等原因吧,这时需要通过设置一些输出信息,来帮助定位错误发生的位置,这...
  • ATMCash4423
  • ATMCash4423
  • 2013-06-24 09:25:33
  • 723

Android 同时安装debug release版, 并且显示不同名字

同一部手机上安装app的debug版和release版, 不会相互覆盖. build.gradlebuildTypes { release { applicat...
  • MAIMIHO
  • MAIMIHO
  • 2017-07-26 09:40:00
  • 1261

Qt debug release包含不同的lib

我们在编译程序时,有时需要跟debug和release配置来包含不同的库,可以在pro文件中如下定义: CONFIG(debug,debug|release) {     LIBS += xxxd...
  • developerqah
  • developerqah
  • 2016-04-25 18:40:39
  • 424

C++ Debug 和 Release 运行结果不同

VS2008 Debug 和 Release 版本程序运行结果不同的可能原因小结
  • yangyangyang20092010
  • yangyangyang20092010
  • 2014-08-22 01:05:45
  • 3130

Android在debug和release模式自动加载不同的配置文件

Android在debug和release模式自动加载不同的配置文件 思路: 1. 判断当前运行在何种模式下 2. 加载配置文件 1. 判断当前运行在何种模式下当直接在eclipse中...
  • junjunyanyan
  • junjunyanyan
  • 2015-02-11 18:34:34
  • 2313

遇到一个debug版本和release版本运行结果不同的问题

程序是这样的,一个opengl渲染全景图的代码,sourceforge上找来的,叫cpano什么的程序,是c语言写的,那过来,取出核心代码 自己用vs2008建了个工程,以c++的方式编译那些c源文件...
  • ldpxxx
  • ldpxxx
  • 2013-07-24 11:20:49
  • 1740

Debug和Release模式下加载不同的库文件

打个比方,程序中 //Debug模式下,我要加载lib_d.dll文件 #pragma comment(lib,"lib_d.lib") //Release模式下,我要加载lib.dll文件 ...
  • lunweiwangxi3
  • lunweiwangxi3
  • 2015-03-19 11:08:43
  • 1327
收藏助手
不良信息举报
您举报文章:qdebug release和debug的不同实现
举报原因:
原因补充:

(最多只允许输入30个字)