如何模拟内存分配错误

时间:2008-09-20 18:56:42

标签: c linux unit-testing gcc memory-management

我的C应用程序使用第三个库,它们自己进行内存管理。 为了保持健壮,我的应用程序有代码来处理由于缺少可用内存而导致的库函数失败。

我想测试这段代码,为此,我需要模拟由于内存不足而导致的失败。

建议使用哪些工具? 我的环境是Linux / gcc。

11 个答案:

答案 0 :(得分:22)

您可以使用ulimit来限制用户可以使用的资源量,包括内存。所以你创建了一个测试用户,将他们的内存使用限制在足以启动你的程序的东西,然后看着它死掉:)

示例:

ulimit -m 64

设置内存限制为64kb。

答案 1 :(得分:13)

创建自己的malloc包装器,它将随机返回null而不是有效指针。好吧,或者如果你想进行单元测试,它会一直失败。

答案 2 :(得分:7)

在过度使用内存的操作系统(例如,Linux或Windows)上,根本无法处理内存不足错误。 malloc可能会返回一个有效的指针,稍后,当您尝试取消引用它时,您的操作系统可能会确定您的内存不足并终止该进程。

http://www.reddit.com/comments/60vys/how_not_to_write_a_shared_library/对此很好。

答案 3 :(得分:5)

您可以使用与第三方库相同的界面编写自己的模拟库,而不是它。您还可以使用LD_PRELOAD覆盖第三方库的所选功能。

答案 4 :(得分:3)

我可以给一个Linux(可能是POSIX)特定的版本:__ malloc_hook,__realloc_hook,__ free_hook。这些是在malloc.h中声明的。

编辑:稍微详细说明:这些是函数指针(请参阅malloc.h及其确切声明的man-page),但要注意:这些不完全是标准,只是GNU扩展。因此,如果可移植性是一个问题,请不要使用它。

稍微不依赖于平台的解决方案可能是您声明了malloc宏。如果你正在测试,这会调用一个钩子和真正的malloc。

memhook.h:

#define malloc(s)    (my_malloc(s))

memhook.c:

#include "memhook.h"
#undef malloc
#include <stdlib.h>

您可以使用它来检测泄漏,随机分配失败等等。

答案 5 :(得分:1)

此外,您应该使用Valgrind对所有内容进行测试,并获得有关程序内存行为的实用有用报告

答案 6 :(得分:0)

你想在bash中使用ulimit命令。尝试

help ulimit
在bash shell提示符下。

答案 7 :(得分:0)

(作为之前一些答案的补充)

Checkout“Electric Fence”获取可与可执行文件一起使用的malloc拦截库的示例(例如,使用LD_PRELOAD技巧)。

一旦你拦截了malloc,你可以使用你想要的任何东西来触发失败。随机触发的故障对系统的各个部分来说都是一个很好的压力测试。您还可以根据请求的内存量修改失败概率。

顺便说一下,你的一些有趣的想法,显然我想对我的一些代码做些什么......

答案 8 :(得分:0)

您可能希望查看一些面向恢复的计算网站,例如Berkeley/Stanford ROC group。我之前听过其中一些人谈过,他们使用代码在C运行时中随机输入错误。在他们的页面底部有一个指向他们的FIT工具的链接。

答案 9 :(得分:0)

看看the way sqlite3 does this。他们进行广泛的单元测试,包括内存测试。

您可能还想查看their page on malloc,尤其是Section 4.0

答案 10 :(得分:0)

您可以在头文件中设置一个定义,以便在使用malloc时返回NULL:

通常,malloc将通过以下方式受到保护:

if ((int *x = malloc(sizeof(int))) == 0)
   return NULL;

因此,您可以使用define强制返回NULL。伪代码示例:

# define if(malloc(x))   if(1)

然后检查是否遇到段错误