You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:23:22