如何使用 EXPECT_DEBUG_DEATH Google 测试宏抑制 Valgrind 检测到的问题?

问题描述 投票:0回答:1

我已经遇到了 Google 单元测试框架和 valgrind 交互的问题。当我使用

EXPECT_DEBUG_DEATH
宏和 memcheck 使用 valgrind 测试代码时,我得到大量日志输出。

valgrind --error-exitcode=1 --leak-check=full --show-leak-kinds=all ./tests

输出开头为:

[ RUN      ] TestCase.MyTest
==15==
==15== Process terminating with default action of signal 6 (SIGABRT): dumping core
==15==    at 0x4C47B94: __pthread_kill_implementation (in /usr/lib64/libc.so.6)
==15==    by 0x4BF6AED: raise (in /usr/lib64/libc.so.6)
==15==    by 0x4BDF87E: abort (in /usr/lib64/libc.so.6)
==15==    by 0x4BDF79A: __assert_fail_base.cold (in /usr/lib64/libc.so.6)
==15==    by 0x4BEF176: __assert_fail (in /usr/lib64/libc.so.6)

每条记录都有很多这样的东西(有 690 条):

59 bytes in 1 blocks are still reachable in loss record 1 of 690

Valgrind 不会将结果总结为带有警告或错误的结果,但正如我所说,它会生成大量输出消息。

我发现 google test 使用克隆来生成子进程,如果测试崩溃(在这种情况下是故意的),valgrind 会认为测试未正确退出。有一个标志

GTEST_DEATH_TEST_USE_FORK
应该可以解决这个问题。 [链接1]

对我不起作用的解决方案:

尝试使用

-DGTEST_DEATH_TEST_USE_FORK=1
运行 cmake,对 valgrind 输出没有任何影响。

我还使用了

GTEST_FLAG_SET(death_test_use_fork, true)
,它给出了错误:“FLAGS_gtest_death_test_use_fork”不是“testing”的成员;然而,当我使用
GTEST_FLAG_SET(death_test_style, "threadsafe")
时,它会编译 - 该标志位于同一个文件中,位于 Death_test_use_fork [Link 1 line 86] 之上。这样做只是为了测试它是否可以完成并编译。

Valgrind 版本:3.21.0

Google测试版本:发布1.12.1

我还能做些什么来让 valgrind 与 EXPECT_DEBUG_DEATH 和平共处?

链接1:death_test_use_fork

fork clone valgrind googletest
1个回答
0
投票

放入 GTEST_FLAG_SET(death_test_style, "threadsafe"); 后在 TEST_F() 内部,valgrind 没有抱怨“仍然可访问”内存,因为“线程安全”标志会导致死亡测试在单独的线程中执行。

© www.soinside.com 2019 - 2024. All rights reserved.