在 Linux 上调试时,我将如何停止占用所有可用内存的程序

How would I stop a program for taking up all available memory while debugging on Linux?

本文关键字:程序 内存 何停止 调试 Linux      更新时间:2023-10-16

假设我用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 进程的内存使用的答案。然后,可以使用调试器跟踪故障点。