美文网首页
第二章 性能瓶颈的分析与定位(19)

第二章 性能瓶颈的分析与定位(19)

作者: 耕田者 | 来源:发表于2022-08-04 18:23 被阅读0次

使用QtCreator的Heob插件

       某些情况下,前述的分析是不够的,因为它只证实程序在持续地累积内存,但无法区分这是设计内行为(构造一个大缓存),还是存在内存泄露。在这种情况下,我们需要检查是否存在内存泄露——这是项艰巨的任务,最好用专用的工具来完成。

       QtCreator在Linux平台支持Valgrind的Memcheck工具,遗憾的是该工具没有Windows版本。值得庆幸的是,与CPU剖析相比,内存剖析的情形并不糟糕,因为QtCreator已经内建集成了heob内存检测工具。

       然而,heob不包含在QtCreator的安装包中,必须手动安装。访问heob下载最新的安装包(本书写作时为heob-2.1.7z)。该压缩包包含heob的两个二进制文件,分别针对32位和64位程序,解压并放入你的工具目录,由于我们使用MinGW,我们需要dwarfstack动态链接库以读取程序的符号信息。访问dwarfstack, 下载最新的压缩包(本书写作时为dwarfstack-2.0-dlls.7z),解压并放在heob二进制文件的相同目录。

       为了测试heob的内存检测功能,我们将像在CPU剖析测试中做的那样,在样例工程的main.cc文件中增加如下二行:

       // induce memory leak

      makeLeak();

      return app.exec();

      makeLeak()函数将分配10,000字节并将其泄露,点击Analyze|Heob, 将出现如下对话框:

Fig. Heob的QtCreator集成

        注意:由于我们使用的QtCreator版本的一个缺陷,该对话框不能显示出来,相反,会显示一个路径无法找到的错误信息。该缺陷已经提交,但由于有补救办法,或许不会被修复。第一个补救办法,在启动Heob之前,如上图所示,在工程的.pro文件中键入TARGET=这行,该行包含可执行程序文件名。当需要再次构建该工程时,记得移除此行。第二个补救办法是增加一个与可执行文件同名不包含.exe后缀的空文件(本例中即QmlWidthModel)。

       当你用一种补救方法解决了上述问题后,即可打开Heob对话框,在Heob路径栏中输入Heob二进制文件的路径,接受所有默认选项,点击OK。如下图所示,heob将启动待测可执行程序并注入其内存管理钩子函数:

Fig. Heob启动测试程序

       当停止测试程序后,memcheck输出面板会输出所发现的内存问题,如下图所示:

Fig. Heob的诊断输出

       可以看到,我们主动引入的内存泄露被检测到了,当点击Memcheck面板中带有源码位置的链接,即能定位到编辑器中源代码行。另外,当用鼠标悬停于某一行时,检测到的内存泄露信息会以提示信息的方式显示出来。

       Heob可以做的远不止这些,例如,它可以检测缓冲区溢出,并在缓冲区溢出时抛出异常或启动调试器。QtCreator使用手册为此对话框中的选项提供了文档(参见heob QtCreator文档),实施上Heob支持的选项比这还要多。在对话框或直接调用时,可通过-H选项启动heob, 获取heob支持的选项列表。

相关文章

网友评论

      本文标题:第二章 性能瓶颈的分析与定位(19)

      本文链接:https://www.haomeiwen.com/subject/tpwpwrtx.html