如何创建随机内存分配失败?

时间:2014-02-19 10:43:09

标签: c++ memory heap ulimit pageheap

我最近发现了一个Windows调试工具PageHeap。其选项 / fault 允许每隔一段时间注入内存分配失败。比如,我希望1个分配每100个或1000个失败,你决定。我们在linux上有类似的东西吗?

我可以想到ulimit,但这不是完全相同的事情,一旦到达内存,它将使每个后续分配失败,而不仅仅是一个。

2 个答案:

答案 0 :(得分:1)

你应该能够自己写。请看一下:Malloc Hooks

答案 1 :(得分:1)

是的,您可以使用LD_PRELOAD执行类似操作;你需要编译如下内容:

#include <dlcfn.h>

void *malloc(size_t size) {
  static unsigned count = 0;
  static void *(*real_malloc)(size_t) = NULL;

  if (!real_malloc)
    real_malloc = dlsym(RTLD_NEXT, "malloc");

  if (++count == 100) {
    count = 0;
    return NULL;
  }

  return real_malloc (size);
}

作为共享对象,例如与

gcc -shared -ldl -fPIC my_malloc.c -o libmy_malloc.so

完成后,您可以像这样运行程序:

LD_PRELOAD=/path/to/libmy_malloc.so ./my_program

它将调用替换malloc()例程。

我认为上面有预先构建的版本,有更多的调试功能,但你明白了。

哦,顺便说一下,上面的代码没有经过测试(用Stack Overflow编写)。如果替换malloc(),它也不是线程安全的你需要线程安全,所以你要使用pthread_once()和{ {1}}用于修复此问题的API。