收藏 分享(赏)

一种基于qt的系统内存泄漏检测方法.doc

上传人:无敌 文档编号:137553 上传时间:2018-03-22 格式:DOC 页数:9 大小:132KB
下载 相关 举报
一种基于qt的系统内存泄漏检测方法.doc_第1页
第1页 / 共9页
一种基于qt的系统内存泄漏检测方法.doc_第2页
第2页 / 共9页
一种基于qt的系统内存泄漏检测方法.doc_第3页
第3页 / 共9页
一种基于qt的系统内存泄漏检测方法.doc_第4页
第4页 / 共9页
一种基于qt的系统内存泄漏检测方法.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、一种基于 Qt 的系统内存泄漏检测方法 张玲 李艳 胡术 李璞 潘倩 四川大学计算机基础教学实验中心 四川大学计算机学院 四川大学视觉合成图形图像技术国防重点学科实验室 摘 要: 在软件开发中, 用户界面程序提高了软件系统易操作性、用户体验度等非功能性需求。长时间、复杂流程的大型软件系统对人机界面的稳定性则提出了较高要求, 不能出现内存泄漏、不能中途异常退出。针对使用图形用户界面应用程序框架 Qt 开发的用户界面程序的内存泄漏问题, 提出了一种基于 Qt 的人机界面程序的源码静态内存检测方法。该方法针对 Qt 控件对象是否存在父控件的两种内存泄漏情况, 识别所需检查的目标对象是否为 Qt 控件

2、类对象, 是否存在内存泄漏。该方法提供的 Qt 控件对象内存检测能力可准确识别目标对象是否存在内存泄漏、手工删除错误等问题, 便于开发人员及时检查错误, 修正缺陷, 减少程序运行中的内存泄漏问题, 以满足大型系统的软件质量需求。关键词: Qt; 内存泄漏; 遍历匹配; 泄漏检测; 作者简介:张玲 (1964-) , 女, 实验师, 研究方向为计算机应用、仿真与网络。收稿日期:2017-01-04基金:中国民航创新基金项目 (MHRD20150228) A Memory Leakage Detection Method for Software System Based on QtZHANG L

3、ing LI Yan HU Shu LI Pu PAN Qian Computer Teaching Experiment Center, Sichuan University; Department of Computer, Sichuan University; Abstract: In software development, the user interface program improves the non-functional requirements of software system, such as easy operation, user experience and

4、 so on.The large-scale training system of long-term and complex process gives the higher requirements to the stability of human-computer interface, no memory leak, no halfway abnormal exit.Aiming at the memory leakage of the user interface program developed by graphical user interface application fr

5、amework Qt, a source static memory detection method of Qt-based humancomputer interface program is presented.There are two types of memory leaks for the Qt control object for the parent control.The method identifies whether the target object to be checked is a Qt control class object, and whether th

6、ere is a memory leak.The memory detection of Qt control object provided by this method can accurately identify whether the target object has a memory leak and manually remove the faults, which makes it easy for the developers to check the errors and correct the defects in time, and to reduce the pro

7、gram running in the memory leakage, meeting the functional requirements of large-scale aviation training system.Keyword: Qt; memory leakage; traversal matching; leak detection; Received: 2017-01-040 引言当下, 大型软件系统开发人机界面所需的开源图形用户界面程序框架选择具有多样性, 如提供了对 Window s 本地组件的访问方式, 兼容了 Linux 及其他 M ono 平台的微软.NET 开发框

8、架图形用户界面 Window s.Froms;用于形状、文档、图像、视频、动画、三维及用于放置控件、内容的控件模型框架, 支持流动文字、3D 视觉效果, 基于 Vista 的用户界面框架 WPF;用于提供原生 Mac OSX 应用程序开发的类库 Mono Mac 等。文中对面向对象、易于使用、允许真正的组件编程并具有优良的跨平台特性的 Qt1框架开发的人机界面进行阐述。Qt 是一个跨平台的基于 C+编程语言的图形用户界面应用程序框架, 该框架提供给应用程序开发者建立艺术级的图形用户界面所需的按钮、滚动条、菜单及其他对象等功能2。在 Qt 中, Qobject 类作为本库大多数类的基类, Qob

9、ject对象总是以树状结构组织自己。在创建一个 Qobject 对象时, 可指定其父对象 (也被称为父控件) , 新创建的对象将被加入到其父对象的子对象 (也被称为子控件) 列表中。当父对象被析构时, 该父对象对应列表中的所有子对象也将被析构, 同理可知, 当某个 Qobject 对象被析构时, 它会将自己从所属父对象的列表中删除, 以避免父对象被析构时, 再次析构自己。由于 Qobject 对象具备上述析构功能, 当使用 new 操作符在堆中创建 Qobject 对象时, 不需要使用delete 操作符析构它们。综上所述, 由于 Qt 的特殊性, 开发人员在使用 Qt 开发软件系统的人机界面

10、时, 极易写出内存处理不适当的程序, 最终导致内存泄露。文中将详细阐述在系统开发中进行 Qt 代码静态内存检查的方法。1 相关工作由于动态分配的内存没有及时、正确地释放而引起的内存泄漏3, 直接影响了程序的可用性和稳定性。内存泄漏分为常发性内存泄漏、偶发性内存泄漏、一次性内存泄漏及隐式内存泄漏等四类情况4。在高级语言编程中, 内存泄漏通常指进程运行时没有调用 delete 操作符将动态分配的内存释放, 但指向该内存的指针却被指向其他内存或被销毁, 导致该内存丢失, 系统失去了对该内存的控制权, 从而造成了内存浪费5。目前, 为解决内存泄漏问题, 一些高级编程语言通过垃圾收集机制6跟踪内存的使用

11、情况, 并按照固定时间间隔周期性自动回收不再使用的动态分配内存, 但目前 C+并不支持该机制。此外, 标准库中相关函数提供了内存泄漏识别、检测功能, 如使用调试堆栈函数和在需要检测内存泄漏的位置添加输入调试信息函数用于输出内存泄漏的地址及其内容, 但该 C 标准函数输出的内存泄露信息不能产生具体的堆栈调用结果, 从而无法得知内存泄漏的具体对象。Insure+7是运行时检测工具, 能检测 C/C+中编程和运行时错误, 检验静态、堆栈以及动态分配内存操作的有效性, 但不支持第三方库函数的内存检测8。文中提出一种基于 Qt 开发的软件系统用户界面程序的内存泄漏检测方法。针对 Qt 中两种专属内存泄漏

12、情况即 Qt 控件对象是否存在父控件提供了静态检测能力, 能够通过在相关配置文件中添加新的 Qt 控件对象识别所需检测的具体对象, 准确识别该对象是否存在内存泄漏, 能够有效地减少程序运行中的内存泄漏问题。2 Qt 内存泄漏检测策略Qt 内存泄漏的原因呈现多变性, 文中主要实现了 Qt 控件对象是否存在父控件两种情况的内存检测功能。Qt 控件对象在没有父控件9的条件下, 若程序在堆中通过 new 操作符创建了一个对象, 则必须通过 delete 操作符析构该对象完成删除操作, 否则程序会出现内存泄露问题;相反地, Qt 控件对象在具有父控件的条件下, 则无需开发人员通过 delete 操作符手

13、动删除该 Qt 控件对象, 因为该控件对象的父控件在析构时, 会自动析构自己对应子控件列表中的控件, 为 Qt 提供了自动内存机制, 在此情况下, 开发人员若误写删除代码, 可能造成冗余删除;除此之外, Qt 中还有其他属于 C+编程语言的内存泄露和冗余析构的情况10。文中提出的方法目前尚未涉及这些情况的检测, 该方法实现了 Qt 控件对象是否有父控件的内存泄漏检测功能。基于 Qt 的系统内存检测方法由扫描工程文件中的所有.cpp 文件和.h 文件, 解析各.cpp 文件及.h 文件中的new、delete 操作符, 存储创建和删除对象的信息, 整合 Qt 控件对象创建、删除的统一完整信息,

14、检测信息输出结果等 5 个模块组成。Qt 内存静态检测框架如图 1 所示。图 1 Qt 内存静态检测框架 下载原图3 Qt 内存泄漏检测实施3.1 扫描工程文件MS Windows 系统中采用_findfirst () 、_findnext () 函数遍历需要检测的工程文件下的所有文件, 将扫描得到的.h 文件和.cpp 文件存放在同一个顺序容器 vector 中11, 文件扫描流程如图 2 所示。图 2 扫描工程所有.cpp 和.h 文件流程 下载原图3.2 解析工程文件遍历顺序容器 vector, 依次对各.cpp 文件、.h 文件执行 get Line () 函数12,获取当前文件中的每

15、一行程序, 识别程序中由 new、delete 操作符执行的对象, 并判断由 new 创建的对象是否为 Qt 控件类。delete 操作符直接删除对象, 不能得到对象类名, 从而不能判断删除的对象是否是 Qt 控件类对象, 因此不需判断由 delete 操作符删除的对象是否是 Qt 控件类, 只需存储由 delete 操作符删除的所有的对象信息。解析工程中的各文件流程如图 3 所示。3.2.1 识别注释、非注释读取文件每行程序, 首先判断该行程序是否为注释, 一般情况下, 编程语言的注释由行注释 (“/”) 和段注释 (“/*XXXX*/”) 组成。注释与代码需区别对待, 通过申明一个 boo

16、l 类型的变量 result 来区别被检测的代码是否为注释, 变量 result 由解析代码的函数返回值更新。图 3 解析文件流程 下载原图若被检测代码为行注释, 则解析进程直接跳过该行即可, 并将变量 result 设置为 comment End (表示注释结束) ;若为段注释, 且在一行代码没有同时出现“/*”和“*/”, 则 result 值为 comment Begin (表示注释开始) , 反之, 若在一行代码中同时存在“/*”和“*/”, 则 result 值为 comment End (表示注释结束) 。进程在解析每行代码时, 需根据 result 值选择不同的解析函数 pars

17、e Comment () (解析注释的函数) , parse Code () (解析代码的函数) 进行 new、delete操作符的检测操作。3.2.2 识别 Qt 控件对象在解析文件的各行代码中, 当代码出现 new 操作符创建对象时, 解析语句获得创建对象的类型并根据该对象的类名来判断是否为 Qt 控件类13。文中识别Qt 控件对象共分为两步:识别程序中创建或析构对象的语句;判断识别出的对象是否为 Qt 类。delete 对象语句的识别处理方式与 new 对象语句相同, 不同之处在于因 delete 语句无法得到对象所属类名, 进而无法判断被删对象是不是Qt 控件类。下面将以 new 操作

18、符创建的对象为示例来阐述识别 Qt 控件对象的具体过程。(1) 识别程序中创建对象的语句。一般情况下, 程序创建 Qt 控件对象的结构如下所示:QPush Buton m_button=new QPush Button (Parent) ;此例代码最具标志性的词分别是 new 操作符和“=”, 而创建对象的 new 操作符应保证是独立的, 需排除“*new*”情况的出现。为识别创建的对象, 需从程序中获取对象的信息, 包括对象名 (m_button) 、类名 (QPush Button) 以及父对象 (parent) 。而对象信息的标识符则是通过“=”、“new”以及“ () ”等来获取各标识

19、符的 begin (第一个字符在整行string 中的索引) 和 end (最后一个字符在整行 string 中的索引) , 然后通过begin 和 end 获得对象信息。C+中, string 类提供了可直接使用的接口用于查找目标对象的信息内容, substr (begin, len) 用于截取子串, find (“arg”) 用于查找索引值, 配合使用 substr () 、find () 函数即可完成对象名、类名及其父对象的查找工作。(2) 判断步骤 (1) 对象是否为 Qt 控件对象。因考虑到识别所有的 Qt 控件对象14是一项繁杂的工作, 目前仅是添加一些常用的 Qt 控件对象以供识

20、别。当然, 程序并没有固定的 Qt 控件对象, 若出现新的 Qt 控件对象需要识别, 在配置文件 Inherit Tree.ini 中手动添加新 Qt 对象即可进行识别操作。Qt 控件对象所属类均具有继承关系, 且对象的最终父对象都为 QWidget 类。针对该继承树关系, 文中通过读取配置文件 Inherit Tree.ini 内容建立了一个树结构, 如图 4 所示。图 4 读 inherit Tree.ini 配置文件生成 Qt 控件类的继承树 下载原图配置文件 Inherit Tree.ini 文件结构如下例所示:树结构提供了接口 find Child (string key, POIN

21、TER若结构体没有父控件, 则必须通过 delete 操作符手动删除, 否则内存泄漏。最后将结果输出到 DOS 界面和日志文件中。其中检测过程的伪代码如下:3.6 实例使用 Qt 代码静态检查15的方法开发一个可执行程序, 该程序运行时需将被检查的代码所在的目录作为运行参数, 目录可包含子目录。该执行程序通过打印输出信息方便开发人员修改代码, 对基于图形用户界面程序框架 Qt 开发的航管训练系统进行描述。以检查“E:/航管训练”工程文件目录下的所有文件为例, 输出示例:(1) 疑似内存泄露:object Name (控件对象名) E:/航管训练/a.cpp (创建对象文件全目录) 600 (行

22、号) ;(2) 疑似手工删除错误:object Name (控件名) parent Name (父控件名) E:/航管训练/a.cpp (创建对象文件全目录) 600 (行号) E:/航管训练/a.cpp (删除对象文件全目录) (行号) 。4 结束语内存泄漏是软件开发中的常见错误, 针对在开发软件系统人机界面出现的内存泄漏情况, 提出了一种基于 Qt 开发的软件系统程序内存检测方法。该方法可以有效检测 Qt 常见内存泄漏、准确定位内存泄漏位置并打印输出该信息, 便于开发人员及时修正错误。Qt 内存泄漏的原因多种多样, 该方法主要实现了 Qt 控件对象是否存在父控件两种情况的内存检测功能, 并

23、没有涉及到属于 C+语言使用中的其他内存泄漏和冗余 delete 情况的检测。参考文献1BLANCHETTE J, SUMMERFIELD M.C+GUI programming with Qt 4M.2nd ed.s.l.:s.n., 2015. 2李全虎.交互界面开发工具-QtJ.中国科技信息, 2005 (5) :33. 3III W P A, LEVINE F E, REYNOLDS W R, et al.Method and system for shadow heap memory leak detection and other heap analysis in an objec

24、t-oriented environment during real-time trace processing:US, US6658652P.2003. 4柳青, 杨英豪, 孙永超.C+内存检测的研究J.电子工业专用设备, 2014, 43 (12) :35-38. 5道夫曼, 纽伯格.C+内存管理M.北京:学苑出版社, 1994. 6谢之易.一种新的适用于面向对象程序设计语言的保守式垃圾收集机制J.计算机应用与软件, 2008, 25 (1) :96-99. 7NANCE J.Product review:insure+J.Linux Journal, 1998, 1998 (51) :1

25、4. 8吴民, 涂奉生.内存泄漏的动态跟踪分析J.计算机工程与应用, 2005, 41 (14) :18-20. 9王卫东, 屈洋.可视化图形界面中有关控件的属性类的研究J.微机发展 (现更名:计算机技术与发展) , 2005, 15 (12) :27-28. 10XU G.Distinguished paper precise memory leak detection for java software using container profiling*J.ACM Transactions on Software Engineering&Methodology, 2008, 22 (3)

26、 :151-160. 11余锋, 祝晓鹰.用 Active X 控件实现目录遍历J.电脑编程技巧与维护, 2001 (4) :43-46. 12LIPPMAN S B, LAJOIE J, MOO B E.C+Primer 中文版M.北京:电子工业出版社, 2013. 13WILLIS T, NEWSOME B.Visual Basic 2010 入门经典M.第 6 版.北京:清华大学出版社, 2011. 14李彬.Linux Qt GUI 开发详解M.北京:北京航空航天大学出版社, 2013. 15DATHATHRI R, REDDY C, RAMASHEKAR T, et al.Dynamic memory access monitoring based on tagged memoryC/International conference on parallel architectures and compilation techniques.s.l.:IEEE, 2013:409-410.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 学术论文 > 期刊/会议论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报