QModbusTcpClient发生内存泄漏

问题现象 之前公司内使用的Qt版本均为5.13,后期因为这个版本不是LTS,还有更新的Chromium所以向上升级到了5.15.X(然而开源版...

八月 24, 2022 · 猫贩子薛定谔

QT使用Breakpad

在c++开发中,很容易出现程序Crash而不出现任何提示的情况,尤其是在使用原生c++开发的情况,如果用了QT之类的框架还可能会输出一点点线索(也可能没有),在引入dump之前,我们都是用断点的方式debug,但是一旦发布出去,那就只能打印整个流程的所有log,来“云”调试。 所以为了解决收集和调试发布之后的程序,需要收集程序崩溃之后的信息,微软在其Windows平台上提供了minidump,需要引用WinDbg的库,注册handler也可以生成,但是这一套方案不是特别好用,而且也不能跨平台,所以Breakpad是比较好的第二方案。 Breakpad Breakpad是谷歌开源的一个跨平台崩溃处理框架,内含崩溃转储、上报、分析一套工作流程框架。 主要的工作流程为:client以library的方式嵌入自己的程序,并设置handler,将会在程序崩溃时将会把一系列的线程列表、调用堆栈和一些系统信息写入minidump文件,再使用dump_syms将编译器生成的调试信息文件生成符号文件,最好在使用minidump_walker生成可以阅读的stack trace。 ...

五月 14, 2020 · 猫贩子薛定谔

C++下实现机制的反射「2」——升级自省功能

在上一篇「part1」中,实现了一个能够存储类的成员变量的结构,使用父类Base中的set_field方法,将派生类的成员变量映射进map中,所以我们只需要在Base类中编写一堆方法就能直接调用派生类的成员变量。 例如: 导出成JSON格式数据 string to_json() { string json = "{"; for(auto i = m_table.begin(); i != m_table.end();) { json.append("\""); json.append(i->first); json.append("\":"); switch(i->second.first) { case INT_TYPE: json.append(to_string(*static_cast<int*>(i->second.second))); break; case DOUBLE_TYPE: json.append(to_string(*static_cast<double*>(i->second.second))); break; case STRING_TYPE: json.append("\""); json.append(*static_cast<string*>(i->second.second)); json.append("\""); break; } if(++i != m_table.end()) { json.append(","); } } json.append("}"); return json; } 由于保存指针的类型是void *,所以在使用的时候都需要对其使用static_cast转化一下,使用强制转换也是可以的,然而因为指针所以是比较危险的操作,推荐还是用cast转化指针类型,才能正确的获取值。就这样不需要每个类都要重写一个方法,就能很愉快的节省时间,如果是QT框架的话还可以直接转化成QJsonObject更方便。 ...

一月 16, 2020 · 猫贩子薛定谔

C++下实现机制的反射「1」——自省

反射(Reflection)机制 是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。wiki 在其他语言中都有大量的应用,尤其是Java中反射与注解配合使用可以大大的减少工作量,降低重复代码,也能使程序更容易维护。现代Java框架中已经离不开反射与注解了。 目标 最近在公司的QT项目中需要大量的使用数据库,虽然QT提供了非常方便的数据库连接驱动与API,但是并没有更方便的ORM功能,只能拼写Sql语句之后运行,再从结果中手动处理得到对象。 虽然这么做并没有什么问题,但是问题是当一个软件设计到一定程度,例如出现了N个需要存储的对象,如果按照Model,DAO,Service,Controller的MVC设计思路,每一个Model都需要手动为其写insert,update,delete的函数。到最后,同样功能的sql语句可能会写十几遍,所以需要设计一套能应对此类情况的框架。 所以,我们就要在C++环境下设计与实现反射机制以及ORM系统。 ...

一月 7, 2020 · 猫贩子薛定谔

QML连接MySQL数据库

QT 5.X以上的版本集成了多种数据库的驱动 QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7 大部分情况只需要QT继承的库就可以完成数据库操作。 小坑 然而在使用Qt createor mingw时会出现无法载入驱动QSqlDatabase: QMYSQL driver not loaded的提示,出现这种情况的原因是Mingw的版本与驱动libmysql.dll不兼容。所以使用VS的情况下能够与Mysql成功连接。 默认安装的mingw都是32位,然而mingw内自带驱动却为64位,如果安装64位的MySQL得到的也是64位,因此需要下载32位的驱动放到mingw的bin目录下。这里提供我使用的版本 MySQL官网下载到的dll为400多kb与MySQL安装路径下的dll同样的大小,也无法成功连接,不知道是不是需要自己再编译一次? ...

八月 8, 2018 · 猫贩子薛定谔