代码之家  ›  专栏  ›  技术社区  ›  jwhitlock

如何强制程序显示内存不足?

  •  28
  • jwhitlock  · 技术社区  · 17 年前

    我有一个C/C++程序,它在内存不足时可能挂起。我们通过同时运行许多副本发现了这一点。我希望在不完全破坏开发机器性能的情况下调试程序。是否有方法限制可用内存,以便新的或malloc在请求500k内存后返回空指针?

    9 回复  |  直到 17 年前
        1
  •  31
  •   chollida    17 年前

    试着把问题转过头,问如何限制操作系统允许您的进程使用的内存量。

    试着调查 http://ss64.com/bash/ulimit.html

    试着说: ULIMIT -V

    这是另一个有点旧但有点背景的链接: http://www.network-theory.co.uk/docs/gccintro/gccintro_77.html

        2
  •  9
  •   Tom    17 年前

    一种方法是围绕malloc()编写包装。

    static unsigned int requested =0;
    
    void* my_malloc(size_tamount){
    
       if (requested + amount < LIMIT){
           requested+=amount;
           return malloc(amount);
       }
    
       return NULL
    }
    

    你可以用一个定义来超载你的malloc。

    正如GMan所言,也可以重载Neal/Debug运算符(C++案例)。

    不知道这是不是最好的方法,或者你在找什么

        3
  •  5
  •   AProgrammer    17 年前
    • 哪个操作系统?对于UNIX,请参见ulimit-d/limit datasize,具体取决于shell(sh/csh)。

    • 您可以为malloc编写一个包装器,该包装器会在所需的circonstance中返回错误。根据您的操作系统,您可能可以用它替代实现的操作系统。

        4
  •  3
  •   Void - Othman    17 年前

    这取决于你的平台。例如,这可以在类Unix平台上通过编程实现,使用 setrlimit(RLIMIT_DATA, ...) .

    编辑 :

    在这种情况下,rlimit ou作为资源也可能很有用。

        5
  •  3
  •   Robert Deml    17 年前

    重写新的和新的[]。

    void* operator new(size_t s)
    {
    }
    void* operator new[](size_t s)
    {
    }
    

    将您自己的代码放在大括号中,以便在对new的x个调用之后选择性地消亡。通常您会调用malloc来分配内存并将其返回。

        6
  •  3
  •   Mr Shark    17 年前

    另一种方法是使用 failmalloc 它是一个共享库,覆盖malloc等,然后失败:-)。它可以让你控制何时失败,并且可以让你随机失败,每N次等等。

    我自己没用过,但听到了好消息。

        7
  •  2
  •   Brian Postow    17 年前

    我曾经有一个学生在CS 1上(在C上,是的,是的,不是我的错),尝试这个方法,然后内存耗尽:

    int array[42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42]..... (42 dimensions);
    

    然后他想知道为什么会出错…

        8
  •  1
  •   atk    17 年前

    如果你想花钱,有一个叫做Holodack by SecurityNovations的工具,它可以让你在程序中注入错误(包括内存不足)。好事情是你可以随意打开和关闭东西。我并没有真正使用过它,所以我不知道是否可以用这个工具在某些地方对故障进行编程。我也不知道支持哪些平台…

        9
  •  1
  •   Bill Lynch    17 年前

    据我所知,在Linux上, malloc 永远不会返回空指针。相反, OOM Killer 将被呼叫。当然,这是,除非你禁用了OOM杀手。一些谷歌搜索应该会得出一个结果。

    我知道这不是你真正的问题,但这与你来自哪里有关。