Qt 4.8.7 内存伪影

Posted

技术标签:

【中文标题】Qt 4.8.7 内存伪影【英文标题】:Qt 4.8.7 memory artefacts 【发布时间】:2018-11-23 08:41:24 【问题描述】:

我需要使用 Qt 4.8.7 for Embedded Linux 创建一个非常简单的项目进行测试。 项目包括 2 种形式 - 对话框(由 QTextEdit 和按钮组成。按钮清除 QTextEdit 和 QClipboard)和 MainWindow(由执行 Dialog 的按钮组成)。

我编辑文本,复制其中的一部分。然后清除编辑器和剪贴板。之后我无法粘贴文本, 但我使用 gcore 转储内存并查看我复制的文本(html 形式的几个副本)。 这些对象留在内存中的是什么?这些是临时对象还是内存泄漏? 或者我用错了。

【问题讨论】:

【参考方案1】:

如果您已经拥有的内核是基于 x86 平台上的 Linux 的基于 ELF 的内核,并且您的进程使用 libc malloc,那么了解这些对象是什么(临时对象或泄漏)的一种方法是使用免费的开源软件https://github.com/vmware/chap 来解决这个问题。构建好 chap 后,您可以这样启动它:

章节核心文件名

然后,要回答您的特定问题,请从 chap 提示符发出以下命令:

重定向

显示泄露

显示锚定

免费显示

然后在 3 个生成的文本文件中分别查看您在核心中看到的模式。如果在“显示泄漏”的输出中看到该模式,则说明您有泄漏。如果在“show anchored”的输出中看到它,则这些对象很可能被保存在某个容器中,但仍有可能泄漏。如果在“show free”的输出中看到它,它来自一个现在已经被释放的临时分配。

或者,如果您已经知道该模式的虚拟地址并想查看它是如何使用的,则在给定核心上启动 chap 后,您可以使用以下命令:

描述十六进制的虚拟地址

【讨论】:

以上是关于Qt 4.8.7 内存伪影的主要内容,如果未能解决你的问题,请参考以下文章

msvc2015 编译 Qt 4.8.7 和 4.8.6

libGL 确实存在,但链接器找不到它 - Qt 4.8.7、CentOS 7.5

WIN10系统下静态编译Qt4.8.7

QT 控件内存管理

qt4.8.7安装

Qt的内存管理机制