如何模拟内存分配错误
6506 观看
11回复
我的C应用程序使用第三个库,它们进行自己的内存管理。为了保持健壮,我的应用程序具有代码来处理由于缺少可用内存而导致的库函数故障。
我想测试这段代码,为此,我需要模拟由于内存不足而导致的故障。
推荐使用什么工具?我的环境是Linux / gcc。
作者: Omer Zak 的来源 发布者: 2019 年 6 月 6 日回应 (11)
22像
您可以使用ulimit
来限制用户可以使用的资源量,包括内存。所以你创建了一个测试用户,将他们的内存使用限制到足以启动你的程序的东西,然后看着它死掉:)
例:
ulimit -m 64
设置内存限制为64kb。
作者: freespace 发布者: 20.09.2008 07:0113像
7像
在过度使用内存的操作系统(例如,Linux或Windows)上,根本无法处理内存不足错误。malloc可能会返回一个有效的指针,稍后,当您尝试取消引用它时,您的操作系统可能会确定您的内存不足并终止该进程。
http://www.reddit.com/comments/60vys/how_not_to_write_a_shared_library/是一个很好的写作。
作者: ChrisInEdmonton 发布者: 23.09.2008 05:125像
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:001像
0像
0像
(作为以前一些答案的补充)
Checkout“Electric Fence”是一个malloc拦截库的示例,您可以将其与可执行文件一起使用(例如,使用LD_PRELOAD技巧)。
一旦你拦截了malloc,你就可以使用你想要的任何东西来触发失败。随机触发的故障对系统的各个部分来说都是一个很好的压力测试。您还可以根据请求的内存量修改失败概率。
顺便说一句,这是一个有趣的想法,显然我想对我的一些代码做些什么......
作者: rlerallut 发布者: 22.09.2008 05:050像
您可能希望查看一些面向恢复的计算站点,例如Berkeley / Stanford ROC组。我之前听过其中一些人谈过,他们使用代码在C运行时中随机输入错误。在他们的页面底部有一个指向他们的FIT工具的链接。
作者: John D. Cook 发布者: 19.10.2008 02:180像
看看sqlite3做到这一点的方式。他们执行广泛的单元测试,包括内存测试。
您可能还想查看malloc上的页面,尤其是Section 4.0。
作者: a_m0d 发布者: 26.05.2010 06:340像
您可以在头文件中设置一个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来自类别的问题 :
- c 如何使用printf格式化unsigned long long int?
- c 理解指针有什么障碍,克服它们可以做些什么?
- c 如何实现延续?
- c How do you pass a function as a parameter in C?
- linux 如何使用Linux命令行将文件作为电子邮件附件发送?
- linux 如何在Linux内核中除以两个64位数字?
- linux 从CLI检查Berkeley DB文件
- linux 如何将密码传递给scp?
- unit-testing TDD和BDD之间的主要区别是什么?
- unit-testing 如何测试私有函数或具有私有方法,字段或内部类的类?
- unit-testing Python单元测试在哪里?
- unit-testing 如何模拟内存分配错误
- gcc 为什么库链接的顺序有时会导致GCC错误?
- gcc 如何在GCC中摆脱从字符串常量到'char *'的过时转换警告?
- gcc 我的程序崩溃时如何自动生成堆栈跟踪
- memory-management 在.NET中使用后将对象设置为Null / Nothing
- memory-management NSAutoreleasePool自动释放池如何工作?
- memory-management 堆栈和堆的内容和位置是什么?