如何模拟内存分配错误

c linux unit-testing gcc memory-management

6506 观看

11回复

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

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

推荐使用什么工具?我的环境是Linux / gcc。

作者: Omer Zak 的来源 发布者: 2019 年 6 月 6 日

回应 (11)


22

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

例:

ulimit -m 64

设置内存限制为64kb。

作者: freespace 发布者: 20.09.2008 07:01

13

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

作者: Vinko Vrsalovic 发布者: 20.09.2008 06:59

7

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

http://www.reddit.com/comments/60vys/how_not_to_write_a_shared_library/是一个很好的写作。

作者: ChrisInEdmonton 发布者: 23.09.2008 05:12

5

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

作者: Allan Wind 发布者: 20.09.2008 06:59

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>

等等

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

作者: terminus 发布者: 20.09.2008 07:00

1

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

作者: Vinko Vrsalovic 发布者: 20.09.2008 07:08

0

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

帮助ulimit
在bash shell提示符下。

作者: jfm3 发布者: 20.09.2008 07:02

0

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

Checkout“Electric Fence”是一个malloc拦截库的示例,您可以将其与可执行文件一起使用(例如,使用LD_PRELOAD技巧)。

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

顺便说一句,这是一个有趣的想法,显然我想对我的一些代码做些什么......

作者: rlerallut 发布者: 22.09.2008 05:05

0

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

作者: John D. Cook 发布者: 19.10.2008 02:18

0

看看sqlite3做到这一点的方式。他们执行广泛的单元测试,包括内存测试。

您可能还想查看malloc的页面,尤其是Section 4.0

作者: a_m0d 发布者: 26.05.2010 06:34

0

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

通常malloc将通过以下方式进行保护:

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

所以你使用define来强制返回NULL; 伪代码示例:

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

并检查是否有段错误

作者: Antonin GAVREL 发布者: 05.11.2018 08:02
32x32