我已经遇到了 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 和平共处?
放入 GTEST_FLAG_SET(death_test_style, "threadsafe"); 后在 TEST_F() 内部,valgrind 没有抱怨“仍然可访问”内存,因为“线程安全”标志会导致死亡测试在单独的线程中执行。