当我在单元测试项目(使用 google 测试)上运行 Qt Creator 中的 Valgrind memcheck 工具时,我的输出出现了一个奇怪的问题。 Qt Creator 很方便,因为它可以过滤掉外部错误,但在我的单元测试项目中,它看起来很难解析 valgrind 输出。举个例子,在我的一个测试中的某个时刻,我有以下内容:
QRegularExpression regExp(RegExpGetter::date());
ASSERT_TRUE(regExp.isValid());
EXPECT_FALSE(regExp.match(QStringLiteral("29-02-2021")).hasMatch());
//...
虽然 Qt Creator 正确解析了一些 Valgrind 输出,但其他输出(例如我上面的测试生成的输出,还有许多其他测试)以 xml 格式显示在控制台输出中。现在,我注意到,一旦出现此问题,下一个错误就不会正确解析,而是全部显示在控制台中(这使得检测我自己的错误变得困难 - 这是轻描淡写的)。我创建了一些显式内存泄漏,虽然之前运行的测试套件中的一些显示正确,但其他一些则没有,但如果我搜索它们,我仍然可以在控制台中找到它们。这是该问题的屏幕截图。
我尝试禁用 Google Test 输出,认为它可能与 Qt Creator 解析 valgrind 结果的方式冲突,但它没有帮助。知道如何解决我的问题吗?
我正在 Ubuntu 虚拟机上运行 valgrind 3.16.1 和 Qt Creator 4.14.2。
您的代码(Qt Regex)创建“自修改代码”或“SMC”。 您必须在 Qt 创建者配置文件中为 valgrind 启用 SMC 选项。 一旦你这样做了,valgrind 就会按预期运行。
请参阅 Qt Regex 文档,其中有一个脚注,您必须为 valgrind 启用 smc-check 选项。