我的C应用程序使用第三个库,它们自己进行内存管理。 为了保持健壮,我的应用程序有代码来处理由于缺少可用内存而导致的库函数失败。
我想测试这段代码,为此,我需要模拟由于内存不足而导致的失败。
建议使用哪些工具? 我的环境是Linux / gcc。
答案 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)
然后检查是否遇到段错误