【问题标题】:How to create random memory allocation failure?如何创建随机内存分配失败?
【发布时间】:2014-02-19 10:43:08
【问题描述】:

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

我可以想到ulimit,但这不是一回事,一旦达到内存,它会使后续的每次分配都失败,而不仅仅是一次。

【问题讨论】:

    标签: c++ memory heap-memory ulimit pageheap


    【解决方案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() 和 pthread_mutex用于解决此问题的 API。

    【讨论】:

    • 这很有趣。我可以假设 operator new 也会调用这个 malloc 吗?
    • @qdii:不,但你也可以替换它。它甚至在 C++ 中是标准的,所以你不需要 LD_PRELOAD hack。
    【解决方案2】:

    你应该可以自己写。看看:Malloc Hooks.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2016-05-01
      • 2013-02-19
      • 2011-12-12
      • 2011-08-23
      相关资源
      最近更新 更多