如何模拟内存分配失败?

时间:2010-04-07 11:51:39

标签: c testing memory-leaks mocking memory-management

我想广泛测试一些C代码以防止内存泄漏。

在我的机器上我有4 Gb的RAM,所以动态内存分配不太可能失败。如果内存分配失败,我仍然希望看到代码的混合,并查看恢复机制是否足够“强大”。

你有什么建议?如何模拟内存规格较低的环境?我如何模拟我的测试?

修改: 我希望我的测试与代码无关。我只有“access”来返回我正在测试的库中不同函数的值。我不应该在我正在测试的代码中编写“测试逻辑”。

6 个答案:

答案 0 :(得分:4)

制作一个包装器malloc并且是免费的,你可以把它自己的逻辑放在那里,当它失败时,什么时候没有。

然后:

#define malloc(X) (myMalloc(X))
#define free(X) (myFree(X))
#define realloc(X, Y) (myRealloc(X, Y))
#define calloc(X, Y) (myCalloc(X, Y))
#define valloc(X) (myValloc(X))

您可以在整个代码中使用#define#undef宏。

答案 1 :(得分:4)

要独立执行此代码,我建议使用内存设置小得多的虚拟机并在其中运行代码。否则,您将继续在具有较小内存配置的实际系统上进行测试。

答案 2 :(得分:3)

如果这是一个unix类型的系统,那么你可以做与jemalloc相同的事情。 实现自己的malloc,将其编译为.so -library并使用LD_PRELOAD = yourmalloc.so开始测试

您可以构建一个允许您控制其运作方式的设置:

void tester() {
     your_malloc_allow_allocation(1024*1024*4); // allow 4 more megs of allocation

     librarycall();
     // ... handle errors..

     your_malloc_reset_limits(); // drop limits
}

答案 3 :(得分:1)

输入*(char *)0;当您希望代码失败或将其存储在已分配的var

中时

(显然它应该被makefile设置的一些#define激活/取消激活)

这个想法是精确控制你想要失败的malloc。我使用前面的技巧来确保如果发生了段错误,我写的程序的行为是什么。我能够检查异常是否被捕获,并且已经分配了对象没有内存泄漏。

您还可以添加某种计数器,使您的alloc仅在一段时间后返回0并检查您的代码是否正确处理这种情况(例如,正确地释放您的程序选择销毁以处理内存饥饿的部分内容) )。

答案 4 :(得分:1)

禁用互换,然后在应用的开头执行while(malloc(1000000));

这将使环境中的可用内存少于1MB,以便运行其他应用程序。调整其他结果的值。

答案 5 :(得分:1)

当我不得不这样做时,我制作了一个小程序,它快速耗尽了所有内存。像这样:

// Beware, brain-compiled code ahead: 
#include <stdlib.h>

bool alloc(size_t n)
{
    return NULL != malloc(n);
}

int main()
{
    size_t n = 1;
    for(;;) {
        while( alloc(n) )
            n*=2;
        do
            n/=2;
        while( !alloc(n) );
    }
}

我对NT系列Windows的体验是,虽然操作系统非常坚固,但其他一切都在我身上崩溃,包括调试器。这样工作没有乐趣。