如何模拟内存分配错误

我的C应用程序使用第三个库,它们自己的内存pipe理。 为了强大,我的应用程序有代码来处理由于缺乏可用内存而导致的库函数失败。

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

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

Solutions Collecting From Web of "如何模拟内存分配错误"

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

例:

 ulimit -m 64 

设置64kb的内存限制。

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

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

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

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

我可以给一个Linux(也许POSIX)特定的版本:__malloc_hook,__realloc_hook,__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> 

等等

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

另外,你应该使用Valgrind来测试这一切,并得到有关你的程序的内存行为的真正有用的报告

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

 帮助ulimit 

在bash shell提示符下。

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

签出“电子围栏”为一个malloc拦截库的例子,你可以使用你的可执行文件(例如使用LD_PRELOAD技巧)。

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

顺便说一下,你的一个有趣的想法显然是我想对我的一些代码做的事情…

您可能需要查看一些面向恢复的计算站点,例如伯克利/斯坦福ROC组织 。 我听说过其中一些人谈过,他们使用代码在C运行库中随机注入错误。 他们的页面底部有一个链接到他们的FIT工具。

看看sqlite3这样做的方式 。 他们执行广泛的单元测试,包括内存不足测试。

你可能也想看看malloc上的页面 ,特别是第4.0节 。