我有一个可能在内存耗尽时挂起的C / C ++程序。我们通过同时运行多个副本来发现这一点。我想在不完全破坏开发机器性能的情况下调试程序。是否有一种方法可以限制可用的内存,以便在请求了500K内存后,new或malloc将返回一个空指针?
我有一个可能在内存耗尽时挂起的C / C ++程序。我们通过同时运行多个副本来发现这一点。我想在不完全破坏开发机器性能的情况下调试程序。是否有一种方法可以限制可用的内存,以便在请求了500K内存后,new或malloc将返回一个空指针?
尝试反其道而行,询问如何限制操作系统允许您的进程使用的内存量。
可以查看 http://ss64.com/bash/ulimit.html。
可以试试输入以下命令:ulimit -v。
这里是另一个链接,有点过时但提供了更多背景信息:http://www.network-theory.co.uk/docs/gccintro/gccintro_77.html
ps
获取了进程ID,然后使用 cat /proc/PID/status
获取了VmPeak和VmSize(在我的情况下是817756kB)。然后我运行了 ulimit -v 800000
并再次尝试,很快就遇到了内存不足的情况(从malloc返回0)。我也可以在gdb下运行它(gdb --args ./program --arg1 --arg2
)并跟踪代码。 - jwhitlock一种方法是编写一个malloc()的包装器。
static unsigned int requested =0;
void* my_malloc(size_tamount){
if (requested + amount < LIMIT){
requested+=amount;
return malloc(amount);
}
return NULL
}
使用哪个操作系统?对于Unix系统,请查看您的shell(sh/csh)下的ulimit -d / limit datasize。
您可以编写一个malloc的包装器,以返回您想要的情况下的错误。根据您的操作系统,您可以将其替换为实现的版本。
重载 new 和 new[]。
void* operator new(size_t s)
{
}
void* operator new[](size_t s)
{
}
在大括号中放入您自己的代码,以选择性地在X次调用new之后结束程序。通常,您会调用malloc来分配内存并将其返回。
编辑:
在这种情况下,RLIMIT_AS资源也可能非常有用。
我曾经有一个学生在C语言的CS 1课程中尝试过这个,但是由于内存不足而失败了:
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);
然后他想知道为什么会出现错误...
1.5013093754529657235677197216425e+68
的数组。 - RCIX如果你想花钱,有一个叫做SecurityInnovations的Holodeck工具可以让你向程序中注入故障(包括低内存)。好处是你可以随意开启和关闭。我并没有真正使用过它,所以我不知道是否可以使用该工具在某些点上编程故障。我也不知道支持哪些平台...