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

标签 c++ memory heap-memory ulimit pageheap

我最近发现了PageHeap ,一个 Windows 调试工具。它的选项 /fault 允许偶尔注入(inject)内存分配失败。就像,我希望每 100 次或 1000 次分配失败一次,由您决定。我们在 Linux 上有类似的东西吗?

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

最佳答案

是的,您可以使用 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。

关于c++ - 如何创建随机内存分配失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878083/

相关文章:

android - 在 Android NDK 中读取指向指针值的指针会崩溃

c++ - 重载指针的右值/常量左值

c++ - 在不复制的情况下将 unique_ptr 的数据释放并转换为另一个

ios - 将 SDWebImage 与解析一起使用

memory - cudaFree 没有释放内存

c++ - 检测到合并排序堆损坏

c++ - c++中以下两种方法有什么区别

c++ - LevelDB --- C++ 代码

c++ - 为什么连续调用 new[] 不分配连续内存?

c - 堆栈内存有限制吗?