c++ - 从 Qt Creator 运行 valgrind 的各种问题(无限运行,黑屏...)
问题描述
所以,当我从 Qt Creator 运行 valgrind memcheck 工具时,我遇到了非常奇怪的问题。
首先,更改工具 -> 选项 -> 分析器 -> Valgrind 中的设置似乎并没有改变任何东西。例如,Backtrace frame count
最初设置为 25,当我将其更改为 20 或任何其他值时,Qt Creator 继续运行 valgrind 和--num-callers=25
.
QProcess
其次,当我用我的单元测试项目(它测试我编写的库)运行 Valgrind 内存分析器时,当我遇到一个测试来验证在只读脚本上启动 a 是否返回预期的错误信号时,我最终会无限运行。为此,我的测试尝试运行具有只读权限的虚拟脚本。在我的测试类中,我创建了一个原始指针,并且该指针在信号被截获QProcess
时执行的槽中被清除。QProcess::finished
我的单元测试程序在到达指令时卡住了process->start(...)
,valgrind 表示内存泄漏,我必须中止它。我知道 valgrind 会使程序变慢,但我尝试过等待,但它只是卡住了。请注意,如果我delete
在start
指令,程序运行到最后(当然,我的测试失败了,因为进程在它有机会尝试运行程序并发出finished
报告错误的信号之前就被删除了)。当我process->waitForFinihed()
在我的过程之前添加时delete
,我又被卡住了。所以在我看来,finished
信号永远不会发出,并且由于某种原因,即使没有process->waitForFinihed()
线程被卡住。即使waitForFinished()
达到超时,它仍然卡住。
我的另一个奇怪的问题是,当我运行我的 QML 应用程序(也使用我的库)时,我得到一个空的白色窗口。我花了一些时间追踪问题的根源,这就是我发现的:
- 当我使用 an
InputPanel
和anApplicationWindow
并且我的源代码尝试注册类型时,我得到一个白色窗口qmlRegisterUncreatableType<MyClass>(...)
- 如果我删除
InputPanel
或使用Window
而不是ApplicationWindow
或不注册我的课程,它会起作用。 - 实际上,我什至不需要执行
qmlRegisterUncreatableType<MyClass>(...)
. 只是在我的源代码中有此代码会导致问题。 qmlRegisterUncreatableType<MyClass>(...)
MyClass
如果属于我的 UI 项目,则不再引起问题。仅当MyClass
来自我的图书馆时才会发生。- 探索该函数的实现,我可以将问题缩小到静态成员的使用
QObject::staticMetaObject
。由于某种原因,从我的库中访问一个类的元对象似乎导致了这个问题。
这对我来说没有多大意义。我无法将所有这些奇怪的错误之间的点联系起来。此外,从终端运行 valgrind 不会导致任何这些问题。我考虑从我的终端而不是 Qt Creator 使用 valgrind,但我最终遇到了来自外部库(Qt 和/或 Qt 使用的库,也许还有我的测试框架)的几十个问题。我在那个混乱中找不到我自己的问题。Qt Creator 允许通过取消勾选来隐藏这些错误External Errors
复选框,非常方便。从终端使用 valgrind 时,我无法获得更清晰的输出,我阅读了有关使用抑制文件的信息,但该过程似乎非常麻烦。也许我在 Qt Creator 中提到的那些问题只是 IDE 中的错误,而从我的终端使用 valgrind 将是解决方案?但是,如何方便地摆脱外部库中的所有 valgrind 错误?
我希望你能帮助我从 Qt Creator 修复 valgrind,或者在我的终端使用它,同时隐藏所有这些我不感兴趣的错误。谢谢。
编辑:我在 Ubuntu 20.04 上运行 Qt Creator 4.14.1,在 VirtualBox VM 中运行。Valgrind 版本是 3.15。
解决方案
推荐阅读
- entity-framework - 实体框架联接是否应包含父表中的表?
- reactjs - React - 监听 div 宽度变化
- c# - C# - 覆盖继承模式
- node.js - 从 React.js + Node.js 中的浏览器地址栏调用 GET api 时如何不显示返回的数据?
- android - 模拟设备上的 Play 商店不能作为真实设备上的 Play 商店
- sql - 从 SQL SELECT 中的子查询和 ROW_NUMBER 窗口函数生成“平均”列
- node.js - req.body 返回未定义 - nodejs
- javascript - Fetch API:如何等到整个响应被下载而不消耗它?
- python - 使用 python 将多表 XML 转换为 Excel
- ios - 用于非网格或半网格布局的 UICollectionView