我想广泛测试一些C代码以防止内存泄漏。
在我的机器上我有4 Gb的RAM,所以动态内存分配不太可能失败。如果内存分配失败,我仍然希望看到代码的混合,并查看恢复机制是否足够“强大”。
你有什么建议?如何模拟内存规格较低的环境?我如何模拟我的测试?
修改: 我希望我的测试与代码无关。我只有“access”来返回我正在测试的库中不同函数的值。我不应该在我正在测试的代码中编写“测试逻辑”。
答案 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的体验是,虽然操作系统非常坚固,但其他一切都在我身上崩溃,包括调试器。这样工作没有乐趣。