如何用Valgrind检测Criterion单元测试中的内存泄漏与上下文错误?
解决Criterion单元测试中Valgrind测不到内存泄漏/上下文错误的问题
为啥会这样?
Criterion默认会给每个测试用例开个子进程运行,测试结束后直接销毁子进程。Valgrind是追踪主进程状态的,子进程里的内存泄漏、上下文错误会随着子进程退出被系统回收,Valgrind根本抓不到。而你直接在main函数里跑代码时,所有逻辑都在主进程中执行,Valgrind自然能正常检测问题。
针对Criterion的解决办法
1. 关掉进程隔离
要么在测试代码开头添加宏定义:
#define CRITERION_NO_ISOLATION #include <criterion/criterion.h>
要么编译时通过预编译参数传递:
gcc -DCRITERION_NO_ISOLATION -o unit_test unit_test.c -lcriterion
这样所有测试用例都会在主进程中执行,Valgrind就能正常捕获内存泄漏和上下文错误了。
2. 让Valgrind追踪子进程
不想关闭隔离机制的话,给Valgrind添加追踪子进程的参数:
valgrind --leak-check=full --trace-children=yes ./unit_test
这种方式会输出每个子进程的检测报告,你需要手动对应到具体的测试用例结果。
替代方案
1. 换用轻量测试框架
如果Criterion的进程隔离机制对你的场景不友好,可以更换无默认隔离的轻量框架:
- MinUnit:仅一个头文件,完全由开发者控制测试执行流程,Valgrind可直接检测所有内存问题
- Check:轻量级测试框架,默认不启用进程隔离,和Valgrind兼容性良好
2. 手动编写测试入口
不依赖Criterion的自动入口,自己写main函数调用测试逻辑:
#include "your_library.h" void test_your_leaky_function() { // 和你在Criterion中写的测试逻辑完全一致 char* ptr = your_leaky_function(); // 故意不释放ptr,模拟内存泄漏 } int main() { test_your_leaky_function(); return 0; }
编译后直接用Valgrind运行,就能像检测普通程序一样捕获内存问题。
内容的提问来源于stack exchange,提问作者nem0z
相关产品推荐
相关产品推荐

