Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何模拟内存分配错误_C_Linux_Unit Testing_Gcc_Memory Management - Fatal编程技术网

C 如何模拟内存分配错误

C 如何模拟内存分配错误,c,linux,unit-testing,gcc,memory-management,C,Linux,Unit Testing,Gcc,Memory Management,我的C应用程序使用第三个库,它们自己管理内存。 为了保持健壮性,我的应用程序有代码来处理由于缺少可用内存而导致的库函数故障 我想测试这段代码,为此,我需要模拟由于内存不足而导致的故障 为此建议使用什么工具? 我的环境是Linux/gcc。创建自己的malloc包装器,它将随机返回null而不是有效指针。或者,如果您想进行单元测试,它会一直失败。您可以使用与第三方库相同的接口编写自己的模拟库,而不是使用它。您还可以使用LD_PRELOAD覆盖第三方库的选定函数。我可以提供一个特定于Linux(可能

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

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

为此建议使用什么工具?
我的环境是Linux/gcc。

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

您可以使用与第三方库相同的接口编写自己的模拟库,而不是使用它。您还可以使用LD_PRELOAD覆盖第三方库的选定函数。

我可以提供一个特定于Linux(可能是POSIX)的版本:malloc_hook、\uu realloc_hook、\uu free_hook。这些在malloc.h中声明

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

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

memhook.h:

#define malloc(s)    (my_malloc(s))
memhook.c:

#include "memhook.h"
#undef malloc
#include <stdlib.h>
#包括“memhook.h”
#未定义malloc
#包括
等等


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

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

例如:

ulimit -m 64

设置64kb的内存限制。

您希望在bash中使用ulimit命令。尝试 help ulimit
在bash shell提示符下帮助ulimit。

此外,您应该使用来测试所有内容,并获得有关程序内存行为的真正有用的报告(作为对前面部分答案的补充)

签出“Electric Fence”以获取可以与可执行文件一起使用的malloc拦截库的示例(例如,使用LD_预加载技巧)

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


你的想法很有趣,顺便说一句,很明显我想在我的一些代码上做些什么…

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


这是一篇很好的文章。

您可能想看看一些面向恢复的计算站点,例如。我以前听过一些人谈论过,他们使用代码在C运行时随机注入错误。在他们的页面底部有一个到FIT工具的链接。

看看。它们执行广泛的单元测试,包括内存不足测试


您可能还想查看,尤其是。

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

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

if ((int *x = malloc(sizeof(int))) == NULL)
{
   return NULL;
}
因此,使用define强制返回空值;伪代码示例:

# define malloc(X) NULL

检查你是否有segfault

我不是西部最快的枪。malloc宏不会帮助模拟第三方库中的故障——它们已经通过调用原始malloc来编译。不过,LD_预加载会有所帮助。该子工具称为massif。massif是一个堆分析器。它测量程序使用的堆内存量。它将生成一个日志和一个postscript(.ps)图。这种行为最近给我的项目带来了严重的痛苦。曼马洛克,看看虫子标题下面。echo/proc/sys/vm/overmit_内存如果为2,则overmit关闭。这个答案完全错误。Overmit很容易被禁用,其他因素,如
ulimit
或耗尽整个虚拟地址空间,也可能导致分配失败。如果禁用Overmit,则您不再处于过度使用内存的系统上;我的评论是关于过度使用内存的系统。在许多情况下,作为程序员,您没有能力禁用Overmit。你与“赦免”讨论的链接非常有趣工具名称似乎是FIG,不合适。另请参见和代码使用的任何其他内存分配函数。在构建发行版时,您需要一种关闭此功能的方法。