在 Linux 上调试时,我将如何停止占用所有可用内存的程序
How would I stop a program for taking up all available memory while debugging on Linux?
假设我用g++编译了一些程序(使用'-g'标志,如果有帮助的话)。我运行它,我的电脑只是锁定,因此迫使我重新启动。我拥有的用户界面根本无法正常工作。Valgrind和GDB也这样做。
我可以将输出放在文件中并在启动计算机时读取它,但这会使调试过程更加耗时,因为我每次运行程序时都必须重新启动计算机。
就我而言,该程序应该占用很小(最多 1/400)百分比的内存。大小为几兆字节。
在C++中,您可以定义一个全局分配器:
void *operator new(size_t sz);
void *operator new[](size_t sz);
void operator delete(void *p);
void operator delete[](void *p);
非投掷版本也是如此。
每次您需要使用实例或数组的new
从堆中获取内存时,都会调用这些函数。
您可以做的是创建一个实现这些功能的模块,该模块将总量限制为 100Mb,然后在通过此限制时中断调试器以查看谁在分配内存。
请注意,这些用户定义的分配函数将仅针对分配new
的内存调用,而不针对分配malloc
的内存调用。另请注意,您可以使用malloc
/free
来实现您的版本(当然您不能使用new
因为它只是一个递归调用)。
一个令人讨厌的事实是,您必须自己记住分配块的大小,因为没有便携式方法来询问 malloc
-ed 块的大小。一种简单的方法是过度分配 8 个字节,并将块大小存储在分配的内存区域之前。
您可以使用操作系统(大概是基于Linux的操作系统)来帮助您在程序消耗过多内存时崩溃。在另一个 StackExchange 网络站点上有一个关于限制单个 Linux 进程的内存使用的答案。然后,可以使用调试器跟踪故障点。
相关文章:
- 应用程序内存使用量减少
- 我们如何在ESP8266上减小程序内存上的代码大小
- 正在从程序内存中分解x指令
- mysqlcppconnen程序内存泄漏
- 这些结构在文件中的大小不同,但在程序内存中的大小相同
- 32 位应用程序内存不足
- C++空程序内存泄漏
- 设备驱动程序内存缓冲区处理器缓存问题
- C 程序内存冲突依赖于 std::cout (?)
- 空的Win32 C++应用程序内存消耗过多
- 在十六进制编辑器中写入程序内存,并以编程方式读取
- 为什么我的程序内存不释放?
- 简单的进程加载程序内存映射
- 虚拟大小导致程序内存不足
- 可视化C++程序内存计算
- 我的C++程序内存泄漏
- 图形驱动程序会导致我的应用程序内存泄漏吗
- 我的应用程序内存增加
- 调用JNI_CreateJavaVM函数后,应用程序内存增加了千兆字节
- 我的简单数独程序内存映射错误